根据我的观察,回显到常规文件echo >>regular_file
会打开该文件,追加到该文件,然后关闭该文件。而 echo 到打开的文件描述符echo >>&fd
* 不会关闭它。这种行为是否记录在 bash/zsh 手册中?
* 这里的 fd 可以是一个数字,比如3
.
答案1
该语法echo >>&fd
不是由 POSIX、Bash 或 zsh 定义的,我假设您的意思是echo >&fd
.这两个操作都涉及文件描述符复制,但第一个操作涉及首先打开指定的文件。在echo >>regular_file
(相当于echo 1>>regular_file
,其中 fd1
是标准输出)shell 首先open
s regular_file
,该操作返回一个文件描述符,然后将返回的 fddup
链接到标准输出 fd 1
,然后关闭前者。命令完成执行后,fd1
被“恢复”(如果创建了 a,则不一定完成fork
,但无论以何种方式完成,fd1
都引用执行命令之前引用的同一文件)。
第二个命令echo >&fd
(同样,相当于echo 1>&fd
)仅复制fd
到 stdout 和不关闭fd
. 再次,执行命令后恢复标准输出。
将第一个操作称为重定向,将第二个操作称为文件描述符复制会更清楚,如 POSIX shell 命令语言和其他 shell 所记录的那样。