Bash
error=$(mkdir test 2>&1) 那個表達式是什麼意思?
我有以下 shell 腳本:
error=$(mkdir test 2>&1)
我知道如果出現錯誤,變數’error’會得到 mkdir 命令的錯誤結果,但是我不明白 2>&1 是如何工作的,有人可以解釋一下嗎?謝謝!
語法
x="$(some_command)"
將執行
some_command
,其輸出將返回並儲存在變數"$x"
.現在,通常,程序將“正常輸出”發送到“標準輸出”流(
stdout
文件句柄#1),並將錯誤消息發送到“標準錯誤”流(stderr
文件句柄#2)。重定向語義
2>&1
意味著(粗略地說;它在幕後有點複雜)“發送stderr
到stdout
”。因此錯誤消息和輸出消息混合在一起。所以我們可以將兩者結合起來:
x="$(some_command 2>&1)"
將返回輸出和錯誤消息並將它們放入
$x
.在你的情況下
error="$(mkdir test 2>&1)"
表示
$error
將包含輸出(為空)和錯誤(如果發生錯誤,*可能包含字元串)。*結果 將包含來自命令$error
的任何錯誤消息。mkdir
我們可以看到這一點。
$ error="$(mkdir /)" mkdir: cannot create directory '/': File exists $ echo "$error" $ error="$(mkdir / 2>&1)" $ echo "$error" mkdir: cannot create directory '/': File exists
在第一種情況下,錯誤消息會立即列印出來,因為它被發送到
stderr
,並且變數為空。在第二種情況下,我們將 stderr 重定向到 stdout,因此它被擷取並儲存在$error
變數中。