近日在網上看題時遇到這麼一條題目:
下面兩條指令分别會有怎樣的輸出
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指令操作檔案描述符