核心概念
- stderr (描述符 2) 和 stdout (描述符 1) 是獨立的檔案描述符。
- 重定向的順序是關鍵,因為每個重定向會即時生效,並影響之後的指令。
範例
分析 ls /etc/nonexistent 2>&1 > /dev/null
的執行過程
步驟 1:2>&1
2>&1
表示將stderr
重定向到stdout
的當前位置。- 在執行這一部分時:
- stdout 此時仍然指向終端(因為尚未被重定向)。
- 所以,stderr 也被重定向到終端。
步驟 2:> /dev/null
> /dev/null
(相當於1> /dev/null
)表示將stdout
重定向到/dev/null
。- 此時:
- stdout 被重定向到 /dev/null。
- stderr 仍然指向終端,因為它已在第一步中跟隨了 stdout 的舊位置(終端)。
總結結果
- stdout 的輸出被丟棄到 /dev/null。
- stderr 的輸出仍然顯示在終端。
對比 ls /etc/nonexistent > /dev/null 2>&1
步驟 1:> /dev/null
> /dev/null
將stdout
重定向到/dev/null
。- 此時:
- stdout 指向 /dev/null。
- stderr 仍然指向終端。
步驟 2:2>&1
2>&1
將stderr
跟隨stdout
的當前位置。- 由於此時
stdout
已指向/dev/null
,所以: - stderr 也被重定向到 /dev/null。
關鍵點:順序影響重定向目標
- 在 2>&1 執行時,stderr 跟隨的是 stdout 的當前位置。
- 如果 stdout 還指向終端,stderr 就會跟隨到終端。
- 如果 stdout 已被重定向到 /dev/null,stderr 就會跟隨到 /dev/null。
- 每個重定向都是即時生效的,不會回溯修改之前的重定向目標。
圖解
