exec 리디렉션이 포함 된 명령 목록을 리디렉션하면 다음과 같이 exec> / dev / null이 여전히 적용되지 않는 것 같습니다.
{ exec >/dev/null; } >/dev/null; echo "Hi"
"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)
. strace를 실행 한 전체 스크립트 컨텐츠를 게시 할 수 있습니까?