bash – 在代码“{exec> / dev / null; } / dev / null“引擎盖下发生了什么?

当您重定向包含exec重定向的命令列表时,exec> / dev / null之后似乎仍未应用,例如:

{ exec >/dev/null; } >/dev/null; echo "Hi"

打印“嗨”.

我的印象是{}命令列表不被视为子shell,除非它是管道的一部分,因此exec> / dev / null仍然应该在我脑海中应用于当前的shell环境中.

现在,如果您将其更改为:

{ 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
最佳答案
让我们来

{ exec >/dev/null; } >/dev/null; echo "Hi"

一步步.

>有两个命令:

一个. {exec> / dev / null; }> / dev / null,后跟

湾回声“嗨”

shell首先执行命令(a),然后执行命令(b).
>执行{exec> / dev / null; }> / dev / null进行如下:

一个.首先,shell执行重定向> / dev / null并记住在命令结束时撤消它.

湾然后,shell执行{exec> / dev / null; }.

C.最后,shell将标准输出切换回原来的位置. (这与ls -lR /usr/share / fonts>〜/ FontList.txt中的机制相同 – 重定向仅在它们所属的命令的持续时间内进行.)
>完成第一个命令后,shell执行echo“Hi”.标准输出是第一个命令之前的任何位置.

转载注明原文:bash – 在代码“{exec> / dev / null; } / dev / null“引擎盖下发生了什么? - 代码日志