このスニペットを考えると:
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
によって開かれ、切り捨てられます)。