关于 exec 的 `exec FD>` 形式

关于 exec 的 `exec FD>` 形式

我在手册页中找不到任何内容来zsh准确解释以下内容(例如)的作用

exec 3> /tmp/foo

我能找到的所有正确文档都指的是后跟“简单命令”的exec形式。 exec(例如参见man zshbuiltins, 和man zshmisc.)(该exec FD>表格在man zshmisc,但在我看来的一段话中假设该表格已在其他地方得到完整且正确的记录。)

我查看了所有的热门作品

man zshall | grep -P '\bexec\b'

...但没有一个是我正在寻找的。

有人知道缺失文档的良好替代品吗?


PS:对于我看来“缺少文档”的一个可能的解释是,像这样的表单exec 3> /tmp/foo实际上是表单“的特殊情况”exec 简单的命令“。但是,如果是这样,那么我想找到解释(1)例如如何3> /tmp/foo是一个简单命令的文档(如果我在命令行上运行这个“简单命令”,它只会挂起,直到我点击^C) ;以及(2)为什么脚本中的代码发生在类似的事情exec 3> /tmp/foo被评估之后,而发生在之后,比如说,exec date没有。

答案1

exec有命令和无命令的含义是无关的。我猜内置名称已超载,因为一种含义对于命令来说没有意义,而另一种含义在没有命令的情况下也没有意义,因此这样做就不必发明一个新名称,而该新名称将无法用于另一个名称命令。

手动的状态:

如果命令省略但指定了任何重定向,则重定向将在当前 shell 中生效。

这意味着,类似于 的内容exec 3> /tmp/foo会更改正在运行的 shell 进程中的文件描述符 3 指向的内容。类似于的 shell 代码片段/bin/somecommand 3>/tmp/foo表示以下内容:

  1. 创建子流程。
  2. 打开/tmp/foo子进程中的文件描述符 3 进行写入。
  3. /bin/somecommand在子进程中执行该文件。

exec 3>/tmp/foo只是执行步骤 3,它不会对进程执行任何操作。

之后exec 3>/tmp/foo,从 shell 及其子进程对文件描述符 3 的所有后续访问都会转到/tmp/foo,就像任何其他重定向一样。例如,假设您在没有任何内容连接到文件描述符 3 的终端中运行以下脚本:

echo hello           # prints to the terminal
echo nope >&3        # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello           # writes to /tmp/out
echo howdy >&3       # writes to /tmp/three
echo wibble >&3      # writes a second line to /tmp/three

相关内容