將標準輸出和標準錯誤重定向到一個檔案

將標準輸出和標準錯誤重定向到一個檔案

我開始了解到,我們有兩種方法將 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 ls -l /binnls-輸出.txt

答案1

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

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

相關內容