`exec {STDIN}>&0` 的作用是什么?

`exec {STDIN}>&0` 的作用是什么?

我在 bash 脚本中看到了这一点,并试图理解它:

exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2

bash 脚本中的指令是否识别 等“魔术字符串” {STDIN}{STDOUT}exec

STDOUT 不是已经设置为&1(并且 STDERR 设置为&2,...)吗?

这些线有什么作用?

答案1

man bash

重定向

在执行命令之前,可以使用 shell 解释的特殊符号来重定向其输入和输出。 [...]

每个重定向前面可能带有文件描述符编号,但前面可能带有以下形式的单词{变量名}。在这种情况下,对于除 >&- 和 <&- 之外的每个重定向运算符,shell 都会分配一个大于或等于 10 的文件描述符,并将其分配给变量名。如果 >&- 或 <&- 前面有{变量名}, 的价值 变量名定义要关闭的文件描述符。

所以你的例子中的几行:

exec {STDIN}>&0
exec {STDOUT}>&1
exec {STDERR}>&2

具有分配三个新文件描述符的效果,它们是当前描述符 0、1 和 2 的重复项,并将这些新描述符的值分别分配给 shell 变量$STDIN$STDOUT$STDERR。执行这些命令后,您应该能够看到重复描述符的值:

$ echo $STDIN $STDOUT $STDERR
10 11 12

这样做最可能的原因是保存 stdin、stdout 和 stderr 的当前配置,以便脚本可以根据脚本某些部分的需要自由地将描述符 0、1 和 2 重定向到各个位置,然后将它们恢复到它们的位置。最初的目标是通过执行以下操作:

exec 0>&$STDIN
exec 1>&$STDOUT
exec 2>&$STDERR

相关内容