我在 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