Bir exec yeniden yönlendirmesi içeren bir komut listesini yeniden yönlendirdiğinizde, exec> / dev / null daha sonra hala uygulanmıyormuş gibi görünür:
{ exec >/dev/null; } >/dev/null; echo "Hi"
"Merhaba" yazdırılır.
{}
Bir boru hattının parçası olmadığı sürece komut listesinin bir alt kabuk olarak görülmediği izlenimi altındaydım , bu yüzden exec >/dev/null
hala aklımdaki mevcut kabuk ortamında uygulanmalıdır.
Şimdi şu şekilde değiştirirseniz:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
beklendiği gibi çıktı yok; dosya tanımlayıcı 1, gelecekteki komutlar için de / dev / null'a işaret ediyor. Bu yeniden çalıştırma ile gösterilir:
{ exec >/dev/null; } >/dev/null; echo "Hi"
hiçbir çıktı vermeyecek.
Bir senaryo hazırlamayı ve onu düzeltmeyi denedim, ama burada tam olarak ne olduğundan emin değilim.
Bu betiğin her bir noktasında STDOUT dosya tanımlayıcısına ne oluyor?
EDIT: strace çıktımı ekleme:
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
;
sonra }
anlamını değiştirir, > /dev/null
bileşik listeye uygulanmaz için {}
sonuçta.
close(10)
. Ayrıca üzerinde çalıştığınız tüm betik içeriklerini de yayınlayabilir misiniz?