次のシェルスクリプトがあります。
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
。
答え2
詩的な用語は、エラーストリームを通常の出力と同じ「チャネル」に送信することを意味します。2
エラーを示します。1
メインラインですか、それとも標準出力。&1
標準出力がどこに行くべきかを示します。デフォルトでは画面に移動し、この代替コンテキストでは$( )
変数に移動してその値になります。そして>
リダイレクトです。すべてを合わせて、2>&1
次のことを意味します。エラーを標準出力にリダイレクトします。
答え3
$()
stderrをstdoutにリダイレクトしてstderrとstdoutをキャプチャします(コマンドがstdoutを親シェルに接続するパイプを置き換えた後に有効です)。
inは他のファイル記述子を参照し、名前が&
。>&1
1
2>
通常どおりstderrをリダイレクトする方法です。