当您重定向包含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)
。您还可以发布您跟踪的整个脚本内容吗?