私はこれをbashスクリプトで見て理解しようとしました。
exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2
Bashスクリプトのディレクティブは他の「魔法文字列」を認識しますか{STDIN}
?{STDOUT}
exec
&1
STDOUTがすでに(そしてSTDERRは&2
、...)に設定されていませんか?
この行は何をしますか?
答え1
からman bash
:
リダイレクト
シェルで解釈される特殊記号を使用して、コマンドを実行する前にコマンドの入力と出力をリダイレクトできます。 [...]
各リダイレクトの前にファイルディスクリプタ番号を付けることができますが、次の形式の単語を前に付けることもできます。{変数名}。この場合、>&-と<&-を除く各リダイレクト演算子に対して、シェルは10以上のファイル記述子を割り当て、変数名。 >&-または<&-が前にある場合{変数名}、の価値 変数名閉じるファイル記述子を定義します。
あなたの例のいくつかの行:
exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2
現在の記述子0、1、2と重複する3つの新しいファイル記述子を割り当て、これらの新しい記述子の値をそれぞれシェル変数に割り当てる$STDIN
効果$STDOUT
があります$STDERR
。このコマンドを実行した後は、重複した記述子の値を表示できるはずです。
$ echo $STDIN $STDOUT $STDERR
10 11 12
これを行う最も可能性の高い理由は、スクリプトが記述子0、1、2をスクリプトの一部に必要なさまざまな場所に自由にリダイレクトできるように、stdin、stdout、およびstderrの現在の構成を保存して復元することです。自分の位置に。最初の目標は、次のことです。
exec 0>&$STDIN
exec 1>&$STDOUT
exec 2>&$STDERR