Ketika Anda mengarahkan ulang daftar perintah yang berisi pengalihan exec, exec> / dev / null tampaknya tidak akan diterapkan setelahnya, seperti dengan:
{ exec >/dev/null; } >/dev/null; echo "Hi"
"Hai" dicetak.
Saya mendapat kesan bahwa {}
daftar perintah tidak dianggap sebagai subkulit kecuali itu adalah bagian dari pipa, jadi exec >/dev/null
seharusnya masih diterapkan dalam lingkungan shell saat ini dalam pikiran saya.
Sekarang jika Anda mengubahnya ke:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
tidak ada output seperti yang diharapkan; deskriptor file 1 tetap menunjuk / dev / null untuk perintah selanjutnya juga. Ini ditunjukkan oleh rerunning:
{ exec >/dev/null; } >/dev/null; echo "Hi"
yang tidak akan memberikan hasil.
Saya mencoba membuat skrip dan menggantinya, tetapi saya masih tidak yakin persis apa yang terjadi di sini.
Pada setiap titik dalam skrip ini, apa yang terjadi pada deskriptor file STDOUT?
EDIT: Menambahkan output strace saya:
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
;
setelah }
, yang mengubah arti > /dev/null
untuk tidak berlaku untuk daftar majemuk {}
setelah semua.
close(10)
. Bisakah Anda juga memposting seluruh konten skrip tempat Anda menjalankan strace?