'exec {fd}</dev/watchdog' 在 Bash 中有什么作用

Gre*_*hal 30 bash io-redirection exec

那是字面意思,{fd}不是占位符。我有一个执行此操作的脚本,并且不引用任何内容,也不引用其他任何地方的 {fd}。这是有效的 bash 吗?

exec {fd}</dev/watchdog

che*_*ner 40

而不是必须选择一个文件描述符并希望它可用:

exec 4< /dev/watchdog  # Was 4 in use? Who knows?
Run Code Online (Sandbox Code Playgroud)

此表示法要求 shell 选择当前未使用的文件描述符,打开文件以读取该描述符,并将编号分配给给定的变量 ( fd)。

$ exec {fd}< /dev/watchdog
$ echo $fd
10
Run Code Online (Sandbox Code Playgroud)

  • @Scott,它不仅在 bash 中,而且仅在 bash 4.1 或更高版本中(因此在 MacOS 上仍然使用的 3.2 版本中不可用)。 (3认同)
  • 请参阅手册页,“重定向”部分的第 2 段。它并没有真正跳到你身上,因为他们没有给出一个明确的例子。 (2认同)
  • 不过,@CharlesDuffy `/dev/watchdog` 在 Mac OS X 上也不存在;它是一个 Linux 特定的设备。 (2认同)

cuo*_*glm 12

表格:

{var}<filename
Run Code Online (Sandbox Code Playgroud)

使外壳打开文件filename以读取并将文件描述符编号存储在变量中var{var}和重定向运算符之间不允许有空格,并且文件描述符编号将大于或等于10

此功能是从原ksh(从2006年的版本ksh93r),bash后来在大量复制它bash-4.1-alpha从2010年开始zsh也比早期的变化bash,从zsh 4.3.42007年的。


Bar*_*mar 5

这在有关重定向的 Bash 手册部分中进行了解释。

前面可能有文件描述符编号的每个重定向可以改为前面有 { varname }形式的单词。在这种情况下,对于除>&-and之外的每个重定向运算符<&-,shell 将分配一个大于 10 的文件描述符并将其分配给 { varname }。如果>&-<&-前面有 { varname },则varname的值定义要关闭的文件描述符。