天天看點

Linux 下 2>&1 和 1>&2 的差別

近日在網上看題時遇到這麼一條題目:

下面兩條指令分别會有怎樣的輸出

 echo hello 1>&2 | grep aaa

 echo hello 2>&1 | grep aaa

  A、兩個均輸出hello

  B、第一個無輸出,第二個輸出 hello

  C、第一個輸出hello,第二個無輸出

  D、兩個均輸出hello

正确答案是 C

這題的考點包括 檔案描述符、重定向、管道符 以及 grep

  • 檔案描述符

    題中的 1 和 2 就是 LInux 系統中的 檔案描述符

    常見的有 0、1 和 2

    0 表示 stdin , 标準輸入

    1 表示 stdout , 标準輸出

    2 表示 strerr , 标準錯誤輸出

  • 重定向

    > 表示 輸出重定向, 本來輸出至螢幕等輸出裝置的資訊可以重新指定其輸出目标

    比如

    who > users

    會将 who 指令的輸出到目前目錄下的 users 檔案中

    < 表示 輸入重定向, 本來由鍵盤接收的輸入可以指定檔案作為輸入源

    比如

    wc -l < users

    表示将 users 中的内容當做标準輸入傳遞給 wc 指令

    綜上

    1>&2 表示 将标準輸出重定向至标準錯誤輸出

    同理, 2>&1 表示 将标準錯誤輸出

    而 管道符( | ) 負責傳遞左邊指令的 stdout 為 右邊指令的 stdin

echo hello 1>&2

最終輸出資訊類型為 stderr , 管道符不會對其進行傳遞,

grep aaa

沒有找到對應字元串, 無輸出

最終輸出 為 左邊指令的 stderr , 即 hello

echo hello 2>&1

最終輸出資訊則為 stdout , 管道符對其傳遞,

grep aaa

沒有找到對應字元串, 無輸出

最終輸出 沒有任何資訊

關于 檔案操作符 的進階操作可以閱讀

Shell exec指令操作檔案描述符

繼續閱讀