run-command: Redirect stderr to a pipe before redirecting stdout to stderr
With this patch, in the 'start_command' function after forking we now take care of stderr in the child process before stdout. This way if 'start_command' is called with a 'child_process' argument like this: .err = -1; .stdout_to_stderr = 1; then stderr will be redirected to a pipe before stdout is redirected to stderr. So we can now get the process' stdout from the pipe (as well as its stderr). Earlier such a call would have redirected stdout to stderr before stderr was itself redirected, and therefore stdout would not have followed stderr, which would not have been very useful anyway. Update documentation in 'api-run-command.txt' accordingly. Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Acked-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c95b3ad9ea
commit
ce2cf27adc
@ -111,9 +111,10 @@ stderr as follows:
|
|||||||
.no_stdin, .no_stdout, .no_stderr: The respective channel is
|
.no_stdin, .no_stdout, .no_stderr: The respective channel is
|
||||||
redirected to /dev/null.
|
redirected to /dev/null.
|
||||||
|
|
||||||
.stdout_to_stderr: stdout of the child is redirected to the
|
.stdout_to_stderr: stdout of the child is redirected to its
|
||||||
parent's stderr (i.e. *not* to what .err or
|
stderr. This happens after stderr is itself redirected.
|
||||||
.no_stderr specify).
|
So stdout will follow stderr to wherever it is
|
||||||
|
redirected.
|
||||||
|
|
||||||
To modify the environment of the sub-process, specify an array of
|
To modify the environment of the sub-process, specify an array of
|
||||||
string pointers (NULL terminated) in .env:
|
string pointers (NULL terminated) in .env:
|
||||||
|
@ -91,6 +91,13 @@ int start_command(struct child_process *cmd)
|
|||||||
close(cmd->in);
|
close(cmd->in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cmd->no_stderr)
|
||||||
|
dup_devnull(2);
|
||||||
|
else if (need_err) {
|
||||||
|
dup2(fderr[1], 2);
|
||||||
|
close_pair(fderr);
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd->no_stdout)
|
if (cmd->no_stdout)
|
||||||
dup_devnull(1);
|
dup_devnull(1);
|
||||||
else if (cmd->stdout_to_stderr)
|
else if (cmd->stdout_to_stderr)
|
||||||
@ -103,13 +110,6 @@ int start_command(struct child_process *cmd)
|
|||||||
close(cmd->out);
|
close(cmd->out);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->no_stderr)
|
|
||||||
dup_devnull(2);
|
|
||||||
else if (need_err) {
|
|
||||||
dup2(fderr[1], 2);
|
|
||||||
close_pair(fderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->dir && chdir(cmd->dir))
|
if (cmd->dir && chdir(cmd->dir))
|
||||||
die("exec %s: cd to %s failed (%s)", cmd->argv[0],
|
die("exec %s: cd to %s failed (%s)", cmd->argv[0],
|
||||||
cmd->dir, strerror(errno));
|
cmd->dir, strerror(errno));
|
||||||
|
Loading…
Reference in New Issue
Block a user