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

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

给定这个片段:

exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar

为什么 bash 会将内容附加到 f?我是不是漏掉了什么?

答案1

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

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

如果你这么做了,情况就会有所不同

echo foo >f
echo bar >f
cat f

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

exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f

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

相关内容