将标准输出和标准错误重定向到一个文件

Ama*_*man 3 bash io-redirection stdout stderr

我已经明白我们有两种方法可以将 stdout 和 stderr 重定向到同一个文件。第一种方法是: ls -l /bin > ls-output.txt 2>&1 正如本书作者所说:使用这种方法,我们执行了2次重定向,首先将stdout重定向到ls-output.txt,然后将stderr(文件描述符2)重定向到stdout(使用文件描述符1) .

重定向的顺序很重要。

ls -l /bin 2>&1 >ls-output.txt 会将 stderr 重定向到屏幕。

我的问题是:像在许多编程语言中一样,命令的设计是否考虑了一些关联性和优先级规则,以及我们如何在屏幕上写入命令时读取命令?什么是命令的后台执行的顺序?

这是我对执行顺序的看法:首先,该命令ls -l /bin将其输出发送到 stdout,并将错误发送到 stderr(其中任何一个)。然后,stderr 被重定向到 stdout。(如果有任何错误,例如:if ls -l /binnis used)现在,stdout 流包含两者之一(输出或错误),然后它重定向到文件ls-output.txt

Bar*_*mar 6

重定向是从左到右处理的。执行时:

ls -l /bin >ls-output.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

shell 在内部执行大约以下操作:

fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);
Run Code Online (Sandbox Code Playgroud)

然后它执行ls -l /bin带有这些描述符附件的命令。由于您首先重定向stdout到文件,因此重定向stderr继承了该重定向。

如果你要写

ls -l /bin 2>&1 >ls-output.txt
Run Code Online (Sandbox Code Playgroud)

操作顺序将被颠倒:

// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
Run Code Online (Sandbox Code Playgroud)

这连接stderr到原始stdout,它很可能是终端。然后它重定向stdout到一个文件;这对 没有影响stderr