Bash

將標準輸出和標準錯誤重定向到一個文件

  • January 12, 2015

我了解到我們有兩種方法可以將 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將其輸出發送到標準輸出並將錯誤發送到標準錯誤(其中任何一個)。然後,stderr 被重定向到 stdout。(如果有任何錯誤,例如:如果ls -l /binn使用)現在,stdout 流包含兩者之一(輸出或錯誤),然後重定向到文件ls-output.txt

重定向是從左到右處理的。當你執行:

ls -l /bin >ls-output.txt 2>&1

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);

然後它執行ls -l /bin帶有這些描述符附件的命令。由於您首先重定向stdout到文件,因此重定向stderr繼承了該重定向。

如果你要寫

ls -l /bin 2>&1 >ls-output.txt

操作順序將顛倒:

// 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);

這連接stderr到原來stdout的 ,很可能是終端。然後它重定向stdout到一個文件;這對 沒有影響stderr

引用自:https://unix.stackexchange.com/questions/177525