コード「{exec> / dev / null; }> / dev / null」内部で何が起きているのでしょうか?
execリダイレクションを含むコマンドリストをリダイレクトする場合、exec> / dev / nullは後で適用されるようには見えません: { exec >/dev/null; } >/dev/null; echo "Hi" 「こんにちは」と印刷されます。 {}コマンドリストはパイプラインの一部でない限り、サブシェルとは見なされないためexec >/dev/null、現在のシェル環境内でコマンドリストを適用する必要があるという印象を受けました。 これを次のように変更すると: { exec >/dev/null; } 2>/dev/null; echo "Hi" 期待どおりの出力はありません。将来のコマンドでも、ファイル記述子1は/ dev / nullをポイントしたままです。これは再実行によって示されます: { exec >/dev/null; } >/dev/null; echo "Hi" 出力されません。 私は台本を作ってそれを追跡しようとしましたが、ここで何が起こっているのか正確にはわかりません。 このスクリプトの各ポイントで、STDOUTファイル記述子はどうなりますか? 編集:私のstrace出力の追加: read(255, "#!/usr/bin/env bash\n{ exec 1>/de"..., 65) = 65 open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = …