このスニペットを考えると:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
なぜbashがfに追加されるのですか?何か不足していますか?
このスニペットを考えると:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
なぜbashがfに追加されるのですか?何か不足していますか?
回答:
欠けているのはf
、exec
呼び出しでファイルを一度だけ開く(および切り捨てる)ことです。2つのecho
コマンドは、すでに開かれているファイル記述子に書き込むだけです。f
したがって、ファイルはどちらのecho
呼び出しでも切り捨てられません。
ファイル記述子に標準出力をリダイレクトするために、構文がある>&n
場合n
、ファイルディスクリプタを示すいくつかの小さな正の整数である(何も存在しない>>&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
)。