Bash

error=$(mkdir test 2>&1) 那個表達式是什麼意思?

  • September 22, 2016

我有以下 shell 腳本:

error=$(mkdir test 2>&1)

我知道如果出現錯誤,變數’error’會得到 mkdir 命令的錯誤結果,但是我不明白 2>&1 是如何工作的,有人可以解釋一下嗎?謝謝!

語法

x="$(some_command)"

將執行some_command,其輸出將返回並儲存在變數"$x".

現在,通常,程序將“正常輸出”發送到“標準輸出”流(stdout文件句柄#1),並將錯誤消息發送到“標準錯誤”流(stderr文件句柄#2)。

重定向語義2>&1意味著(粗略地說;它在幕後有點複雜)“發送stderrstdout”。因此錯誤消息和輸出消息混合在一起。

所以我們可以將兩者結合起來:

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變數中。

引用自:https://unix.stackexchange.com/questions/311402