给定这个片段:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
为什么 bash 会将内容附加到 f?我是不是漏掉了什么?
答案1
您缺少的事情是您只f
在调用中打开(并截断)文件一次exec
。这两个echo
命令只是写入一个已经打开的文件描述符。因此,该文件f
不会被任何echo
调用截断。
要将标准输出重定向到文件描述符,语法是>&n
wheren
是一些表示文件描述符的小正整数(没有>>&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
)。