私はその人を読みexec
ましたが、まだ私が作業しているスクリプトで次の2行の結果を理解していません。
exec >> >(tee -a $logfile)
exec 2>&1
私は読んだこの回答しかし、まだ疑いがあります。
私が理解したところ、最初の行は>>
スクリプトファイルの右側の$logfile
すべての項目に出力(追加)を生成します。>>
2行目は、スクリプトの2(stderr)出力を1(stdout)にリダイレクトします。
- 私の理解は正しいですか?
- 元に戻した後の動作がこの2行を実行する前と同じように、上記のコマンドを元に戻すにはどうすればよいですか?
- スクリプトを進めて、バックグラウンドでいくつかのアプリケーションを実行するとしましょう
someapp &
。私はこのコマンドをスクリプトとは別に端末で実行したいと思います。これにより、スクリプトで実行するのと同じ効果が表示されます。someapp &
上記のsを使用してリダイレクトを設定するにはどうすればよいですかexec
?
ベストアンサー1
exec >> >(tee -a $logfile)
不足:
exec 1>> >(tee -a $logfile)
以下と同じ:
exec 1>> /dev/fd/x
x
パイプの書き込みの終わりを指すファイル記述子はどこにありますか?
以前は、bash
パイプのもう一方の端に接続されているfd 0(stdin)を使用して子プロセスが開始され、同時に実行されていましたtee
。
exec 1>> file
、O_TRUNCなしでO_APPENDを使用してファイルを開き、結果fdを1に移動します。
/dev/fd/x
システムによっては、exec dup(x)
(ほとんど)またはfd x(Linuxおよびcygwinのみ)でopenと同じファイルを開きます。ここではfdするときに違いはexec > >(...)
ありません。
これは少し外れたトピックですが、tee -a $logfile
正しくありません。パスがO_APPENDに保存されているファイルをtee -a -- "$logfile"
開くことが意図されている場合は、$logfile
そうする必要があります。
したがって、このコマンドの後、シェルのfd 1はパイプを指します。パイプのもう一方の端からtee
来る内容を読み、リダイレクト前にstdoutが指すすべての項目(スクリプトの出力が何らかの方法でリダイレクトされた場合は端末デバイスまたは他のデバイス)tee
に送信されます。$logfile
exec 2>&1
fd 2がfd 1と同じものを指すようにして、同じパイプを作成します。
これを行うには保存する必要があります。ファイル説明を開くリダイレクトの前に、fds 1と2は別々のfdsで開かれていました。
exec 3>&1 4>&2 > >(tee -a -- "$logfile") 2>&1
3>&1
ここで fd 3 はdup2(1, 3)
fd 1 と同じ開かれたファイル記述を指します。
元に戻して、
exec >&3 2>&4 3>&- 4>&-
someapp
あるいは、stdoutとstderrを生のstdoutとstderrとして実行します。
someapp >&3 2>&4 3>&- 4>&- &