Bash
將標準輸出和標準錯誤重定向到一個文件
我了解到我們有兩種方法可以將 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
。