Коли ви переспрямовуєте список команд, який містить перенаправлення 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?
EDIT: Додавання мого виведення страз:
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)
. Чи можете ви також розмістити весь вміст сценарію, на який ви стикалися?