error=$(mkdir test 2>&1) この表現はどういう意味ですか?

error=$(mkdir test 2>&1) この表現はどういう意味ですか?

次のシェルスクリプトがあります。

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は他のファイル記述子を参照し、名前が&>&11

2>通常どおりstderrをリダイレクトする方法です。

関連情報