Bash I/O リダイレクトについて

Bash I/O リダイレクトについて

私はBashのファイル記述子を使って実際のレベルでI / Oリダイレクトがどのように行われているのかを知っていますが、オンラインでケースを見つけました(https://linuxcommand.org/lc3_adv_dialog.php、「方法2:コマンドの置き換えとリダイレクトの使用」では、なぜ使用されるのかを完全に理解していません。

コマンド置換エラーをキャッチするためにstderrをstdoutにリダイレクトする必要がある実装があります。擬似コード:

exec 3>&1
...
var=$(cmd -options ... 2>&1 1>&3)
...
exec 3>&-

stdoutをバックアップし、stdoutをすでに指している場所にリダイレクトするのはなぜですか? stdoutはstderrの内容を受け取ることを除いて、変更されたことはありません。

私の推測では、fd 3にstdoutの元の状態が含まれており、fd 1をfd 3にリダイレクトすると元の状態に戻り、fd 2もそこにリダイレクトされます。洞察力や読書資料が欲しい

ベストアンサー1

最初に作成したフォームでは、コマンドは単なるものです。これはcmd -options ... 2>&1 1>&3実際にはstderrとstdoutの両方がstdoutにリダイレクトされるため意味がありません。したがって1>&3、必要ありません。

しかし、言われた例は別の状況です。私たちが持っているのはですvariable=$(cmd -options ... 2>&1 1>&3)。この$(command)設定はstdout自体をリダイレクトしてcommandキャプチャして変数に配置できるようにします。したがって、この場合、最初のstderrはcommand次にリダイレクトされます。すでにリダイレクト済み標準出力( 2>&1)、つまり。変数に配置され、このstdoutはcommand次にリダイレクトされます。オリジナルリダイレクト前はstdout、記述子3(1>&3)に格納されます。効果はこんな感じです標準エラーcommand変数に配置されます。標準出力variable=$(command)stdoutが変数に配置され、stderrが表示される「通常」ケースとは異なり、通常表示されます。これはあなたがリンクした同じページで非常によく説明されています。

一見すると、リダイレクトは無意味に見えるかもしれません。まず、execを使用してファイルディスクリプタ1(stdout)をディスクリプタ3にコピーして、ディスクリプタ1のバックアップコピーを作成します(追加のリダイレクトではダールーム)。

次のステップは、コマンド置換を実行し、ダイアログコマンドの出力を変数結果に割り当てることです。このコマンドは、ディスクリプタ2(stderr)をディスクリプタ1のコピーにリダイレクトし、最後にバックアップコピーを含むディスクリプタ3をコピーしてディスクリプタ1を元の値に復元します。明確ではないかもしれないのは、最後のリダイレクトが必要な理由です。サブシェル内では、標準出力(説明者1)は制御端末に渡されません。代わりに、その内容を変数の結果に渡すパイプを指します。ダイアログボックスが入力ボックスを表示できるように端末を指す標準出力が必要なので、標準エラーを標準出力にリダイレクトしてから(ダイアログボックスの出力が結果変数で終わるように)、標準出力を再度リダイレクトする必要があります。制御端末で。

おすすめ記事