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) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
close(10) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
dup2(10, 1) = 1
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, TCGETS, 0x7ffee027ef90) = -1 ENOTTY (Inappropriate ioctl for device)
write(1, "hi\n", 3) = 3
ベストアンサー1
私たちに従ってください。
{ exec >/dev/null; } >/dev/null; echo "Hi"
段階的に。
2つのコマンドがあります。
ㅏ。
{ exec >/dev/null; } >/dev/null
、続いて雨。
echo "Hi"
シェルはまずコマンド(a)を実行し、次にコマンド(b)を実行します。
執行
{ exec >/dev/null; } >/dev/null
収益は次のとおりです。ㅏ。まず、シェルがリダイレクトを実行します。
>/dev/null
コマンドが終わったら元に戻すことを忘れないでください。。b。その後、シェルが実行されます
{ exec >/dev/null; }
。氏。最後に、シェルは標準出力を元の位置に戻します。 (これは、
ls -lR /usr/share/fonts >~/FontList.txt
自分が属するコマンド期間中にのみ発生するリダイレクトと同じメカニズムです。)最初のコマンドが完了すると、シェルが実行されます
echo "Hi"
。標準出力は最初のコマンドの前に配置されます。