mirror of
https://github.com/tmux/tmux.git
synced 2025-09-06 11:28:24 +00:00
Add -E to run-shell to forward stderr as well as stdout, from github at
jyn dot dev in GitHub issue 4246.
This commit is contained in:
@@ -44,8 +44,8 @@ const struct cmd_entry cmd_run_shell_entry = {
|
|||||||
.name = "run-shell",
|
.name = "run-shell",
|
||||||
.alias = "run",
|
.alias = "run",
|
||||||
|
|
||||||
.args = { "bd:Ct:c:", 0, 1, cmd_run_shell_args_parse },
|
.args = { "bd:Ct:Es:c:", 0, 1, cmd_run_shell_args_parse },
|
||||||
.usage = "[-bC] [-c start-directory] [-d delay] " CMD_TARGET_PANE_USAGE
|
.usage = "[-bCE] [-c start-directory] [-d delay] " CMD_TARGET_PANE_USAGE
|
||||||
" [shell-command]",
|
" [shell-command]",
|
||||||
|
|
||||||
.target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },
|
.target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL },
|
||||||
@@ -158,6 +158,9 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
else
|
else
|
||||||
cdata->cwd = xstrdup(server_client_get_cwd(c, s));
|
cdata->cwd = xstrdup(server_client_get_cwd(c, s));
|
||||||
|
|
||||||
|
if (args_has(args, 'E'))
|
||||||
|
cdata->flags |= JOB_SHOWSTDERR;
|
||||||
|
|
||||||
cdata->s = s;
|
cdata->s = s;
|
||||||
if (s != NULL)
|
if (s != NULL)
|
||||||
session_add_ref(s, __func__);
|
session_add_ref(s, __func__);
|
||||||
|
17
job.c
17
job.c
@@ -79,7 +79,7 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e,
|
|||||||
struct job *job;
|
struct job *job;
|
||||||
struct environ *env;
|
struct environ *env;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int nullfd, out[2], master;
|
int nullfd, out[2], master, do_close = 1;
|
||||||
const char *home, *shell;
|
const char *home, *shell;
|
||||||
sigset_t set, oldset;
|
sigset_t set, oldset;
|
||||||
struct winsize ws;
|
struct winsize ws;
|
||||||
@@ -152,12 +152,15 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e,
|
|||||||
if (~flags & JOB_PTY) {
|
if (~flags & JOB_PTY) {
|
||||||
if (dup2(out[1], STDIN_FILENO) == -1)
|
if (dup2(out[1], STDIN_FILENO) == -1)
|
||||||
fatal("dup2 failed");
|
fatal("dup2 failed");
|
||||||
|
do_close = do_close && out[1] != STDIN_FILENO;
|
||||||
if (dup2(out[1], STDOUT_FILENO) == -1)
|
if (dup2(out[1], STDOUT_FILENO) == -1)
|
||||||
fatal("dup2 failed");
|
fatal("dup2 failed");
|
||||||
if (out[1] != STDIN_FILENO && out[1] != STDOUT_FILENO)
|
do_close = do_close && out[1] != STDOUT_FILENO;
|
||||||
close(out[1]);
|
if (flags & JOB_SHOWSTDERR) {
|
||||||
close(out[0]);
|
if (dup2(out[1], STDERR_FILENO) == -1)
|
||||||
|
fatal("dup2 failed");
|
||||||
|
do_close = do_close && out[1] != STDERR_FILENO;
|
||||||
|
} else {
|
||||||
nullfd = open(_PATH_DEVNULL, O_RDWR);
|
nullfd = open(_PATH_DEVNULL, O_RDWR);
|
||||||
if (nullfd == -1)
|
if (nullfd == -1)
|
||||||
fatal("open failed");
|
fatal("open failed");
|
||||||
@@ -166,6 +169,10 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e,
|
|||||||
if (nullfd != STDERR_FILENO)
|
if (nullfd != STDERR_FILENO)
|
||||||
close(nullfd);
|
close(nullfd);
|
||||||
}
|
}
|
||||||
|
if (do_close)
|
||||||
|
close(out[1]);
|
||||||
|
close(out[0]);
|
||||||
|
}
|
||||||
closefrom(STDERR_FILENO + 1);
|
closefrom(STDERR_FILENO + 1);
|
||||||
|
|
||||||
if (cmd != NULL) {
|
if (cmd != NULL) {
|
||||||
|
Reference in New Issue
Block a user