Когда вы перенаправляете список команд, который содержит перенаправление 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
;
после }
, который меняет значение, > /dev/null
чтобы не применять к составному списку в {}
конце концов.
close(10)
. Можете ли вы также опубликовать все содержимое скрипта, на котором вы работали?