回答:
番号はファイル記述子であり、最初の3つ(ゼロから始まる)のみが標準化された意味を持ちます。
0 - stdin
1 - stdout
2 - stderr
したがって、コマンド内のこれらの番号はそれぞれファイル記述子を参照します。ファイル記述子をファイルに>
リダイレクトするか、別のファイル記述子にリダイレクトすることができます>&
3>&1
あなたのコマンドラインでは、新しいファイル・ディスクリプタを作成し、それにリダイレクトされます1
されていますSTDOUT
。今すぐ1>&2
にファイルディスクリプタ1をリダイレクトするSTDERR
と、2>&3
ある3へのファイルディスクリプタ2をリダイレクトしますSTDOUT
。
だから基本的にあなたが切り替えSTDOUT
てSTDERR
、これらはステップです:
ここで、プログラムがファイル記述子1に何かを出力すると、ファイル記述子2に出力され、その逆も同様です。
スワッピングstdout
とstderr
です。
>name
出力をfileにリダイレクトすることを意味しますname
。
>&number
出力をファイル記述子にリダイレクトすることを意味しますnumber
。
そのため&
、シェルにファイル名ではなくファイル記述子を意味するように指示する必要があります。
ファイル記述子は、すでに開いているファイルを参照する番号です。標準のものは0
、標準入力、1
標準出力、または2
標準エラー用です。また、他の番号を使用することもできます。これにより、で新しい変数を作成するときと同じように、新しいファイル記述子が作成されvar=value
ます。
デフォルトでは、ファイル記述子1
との両方に2
移動する/dev/tty
ためsomecommand 3>&1 1>&2 2>&3
、新しいシェルで実行しても何も変わりません(ファイル記述子番号が3になった場合を除く)。
ただし、スクリプトのどこかでexecを使用してリダイレクトをexec 2>error.log
実行する場合(例)、またはリダイレクトを含むコマンドラインでスクリプトを実行する場合(例./thescript 2>error.log
:)、stdoutとstderrの交換は何かを行います。
特定のケースでは、stdoutとstderrを交換しているコマンドはdialog
です。そのmanページを見ると、
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
おそらく、スクリプトを書いた人は、何らかの理由での代わりにdialog
の出力を望んでいます。stdout
stderr
リダイレクトの順序も参照してください
スクリプト作成者は、次のようなfd 3を定義しました。
exec 3<> File.txt
「File.txt」を開き、fd 3を割り当てます。最大ファイル記述子:255
read -n 4 <&3
4文字のみを読み取ります。
echo -n . >&3
そこで小数点を書きます。
exec 3>&-
fd 3を閉じます。
cat File.txt
==> 1234.67890