为什么 bash 重定向到文件发生在追加模式

use*_*819 8 io-redirection shell-script file-descriptors

鉴于此片段:

exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Run Code Online (Sandbox Code Playgroud)

为什么 bash 附加到 f?我错过了什么吗?

Kus*_*nda 19

您缺少的是fexec调用中您只打开(并截断)文件一次。这两个echo命令只是写入已经打开的文件描述符。f因此,该文件不会被任一echo调用截断。

要将标准输出重定向到文件描述符,语法是>&nwhere nis 一些表示文件描述符的小正整数(没有>>&n重定向)。文件描述符必须已经与打开的文件相关联才能工作。这是打开文件并将其与exec 3>f截断文件的描述符相关联的行为exec 3>>f不会截断文件并会以追加模式打开它)。仅写入 with>&3不会打开文件,也不会截断它。

如果你做了它会有所不同

echo foo >f
echo bar >f
cat f
Run Code Online (Sandbox Code Playgroud)

(每个echo都打开和截断f),或者,更复杂,

exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
Run Code Online (Sandbox Code Playgroud)

(文件exec在每个之前打开并被截断echo)。