diff --git a/cmd-run-shell.c b/cmd-run-shell.c index 4b4399c8..045f551e 100644 --- a/cmd-run-shell.c +++ b/cmd-run-shell.c @@ -44,8 +44,8 @@ const struct cmd_entry cmd_run_shell_entry = { .name = "run-shell", .alias = "run", - .args = { "bd:Ct:c:", 0, 1, cmd_run_shell_args_parse }, - .usage = "[-bC] [-c start-directory] [-d delay] " CMD_TARGET_PANE_USAGE + .args = { "bd:Ct:Es:c:", 0, 1, cmd_run_shell_args_parse }, + .usage = "[-bCE] [-c start-directory] [-d delay] " CMD_TARGET_PANE_USAGE " [shell-command]", .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL }, @@ -158,6 +158,9 @@ cmd_run_shell_exec(struct cmd *self, struct cmdq_item *item) else cdata->cwd = xstrdup(server_client_get_cwd(c, s)); + if (args_has(args, 'E')) + cdata->flags |= JOB_SHOWSTDERR; + cdata->s = s; if (s != NULL) session_add_ref(s, __func__); diff --git a/job.c b/job.c index ab696e36..a8d4ba9c 100644 --- a/job.c +++ b/job.c @@ -79,7 +79,7 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct job *job; struct environ *env; pid_t pid; - int nullfd, out[2], master; + int nullfd, out[2], master, do_close = 1; const char *home, *shell; sigset_t set, oldset; struct winsize ws; @@ -152,19 +152,26 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, if (~flags & JOB_PTY) { if (dup2(out[1], STDIN_FILENO) == -1) fatal("dup2 failed"); + do_close = do_close && out[1] != STDIN_FILENO; if (dup2(out[1], STDOUT_FILENO) == -1) fatal("dup2 failed"); - if (out[1] != STDIN_FILENO && out[1] != STDOUT_FILENO) + do_close = do_close && out[1] != STDOUT_FILENO; + if (flags & JOB_SHOWSTDERR) { + 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); + if (nullfd == -1) + fatal("open failed"); + if (dup2(nullfd, STDERR_FILENO) == -1) + fatal("dup2 failed"); + if (nullfd != STDERR_FILENO) + close(nullfd); + } + if (do_close) close(out[1]); close(out[0]); - - nullfd = open(_PATH_DEVNULL, O_RDWR); - if (nullfd == -1) - fatal("open failed"); - if (dup2(nullfd, STDERR_FILENO) == -1) - fatal("dup2 failed"); - if (nullfd != STDERR_FILENO) - close(nullfd); } closefrom(STDERR_FILENO + 1);