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
您缺少的是f
在exec
调用中您只打开(并截断)文件一次。这两个echo
命令只是写入已经打开的文件描述符。f
因此,该文件不会被任一echo
调用截断。
要将标准输出重定向到文件描述符,语法是>&n
where n
is 一些表示文件描述符的小正整数(没有>>&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
)。