Gdy przekierowujesz listę poleceń zawierającą przekierowanie exec, exec> / dev / null nie wydaje się być później stosowane, na przykład z:
{ exec >/dev/null; } >/dev/null; echo "Hi"
Drukowane jest „Cześć”.
Miałem wrażenie, że {}
lista poleceń nie jest uważana za podpowłokę, chyba że jest ona częścią potoku, więc exec >/dev/null
powinna być nadal stosowana w bieżącym środowisku powłoki.
Teraz, jeśli zmienisz to na:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
wyniki nie są zgodne z oczekiwaniami; deskryptor pliku 1 pozostaje wskazany na / dev / null również dla przyszłych poleceń. Pokazuje to ponowne uruchomienie:
{ exec >/dev/null; } >/dev/null; echo "Hi"
co nie da wyniku.
Próbowałem napisać scenariusz i wyszukać go, ale wciąż nie jestem pewien, co dokładnie się tutaj dzieje.
Co dzieje się z deskryptorem pliku STDOUT w każdym punkcie tego skryptu?
EDYCJA: Dodanie mojego wyjścia 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
;
po }
, co zmienia znaczenie, > /dev/null
by nie stosować się do listy złożonej {}
.
close(10)
. Czy możesz również opublikować całą zawartość skryptu, na którym uruchomiłeś strace?