次のシェルスクリプトがあります。
error=$(mkdir test 2>&1)
エラーがあると、「error」変数がmkdirコマンドのエラー結果を得ることがわかりますが、2>&1がどのように機能するかを理解できません。誰かが説明できますか?ありがとうございます!
ベストアンサー1
文法
x="$(some_command)"
実行されsome_command
、出力返され、変数に保存されます"$x"
。
通常、プログラムは「標準出力」ストリーム(stdout
、ファイルハンドル#1)に「通常出力」を送信し、「標準エラー」ストリーム(stderr
、ファイルハンドル#2)にエラーメッセージを送信します。
リダイレクト2>&1
の意味は(おおよそ、実際には少し複雑です)「送信stderr
」を意味しますstdout
。したがって、エラーメッセージと出力メッセージが混在します。
したがって、私たちは2つを組み合わせることができます:
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
変数は空です。 2番目のケースでは、stderrをstdoutにリダイレクトしてキャプチャして変数に保存します$error
。