Khi bạn chuyển hướng một danh sách lệnh có chứa chuyển hướng exec, exec> / dev / null dường như vẫn không được áp dụng sau đó, chẳng hạn như với:
{ exec >/dev/null; } >/dev/null; echo "Hi"
"Hi" được in.
Tôi có ấn tượng rằng {}
danh sách lệnh không được coi là một nhánh con trừ khi nó là một phần của đường ống, do đó, exec >/dev/null
vẫn nên được áp dụng trong môi trường shell hiện tại trong tâm trí của tôi.
Bây giờ nếu bạn thay đổi nó thành:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
không có đầu ra như mong đợi; mô tả tập tin 1 vẫn được chỉ vào / dev / null cho các lệnh trong tương lai. Điều này được thể hiện bằng cách chạy lại:
{ exec >/dev/null; } >/dev/null; echo "Hi"
mà sẽ không cho đầu ra.
Tôi đã thử tạo một kịch bản và phân loại nó, nhưng tôi vẫn không chắc chính xác những gì đang xảy ra ở đây.
Tại mỗi điểm trong tập lệnh này, điều gì đang xảy ra với bộ mô tả tệp STDOUT?
EDIT: Thêm đầu ra strace của tôi:
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
;
sau }
, thay đổi ý nghĩa của > /dev/null
việc không áp dụng cho danh sách ghép {}
sau khi tất cả.
close(10)
. Bạn cũng có thể đăng toàn bộ nội dung kịch bản mà bạn đã chạy trên không?