我在手册页中找不到任何内容来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
表示以下内容:
- 创建子流程。
- 打开
/tmp/foo
子进程中的文件描述符 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