web-dev-qa-db-ja.com

追加モードでファイルへのbashリダイレクトが発生する理由

このスニペットを考えると:

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

Bashがfに追加されるのはなぜですか?何か不足していますか?

8
user374819

欠けているのは、f呼び出しで、ファイルexecを一度だけ開く(および切り捨てる)ことです。 2つのechoコマンドは、すでに開かれているファイル記述子に書き込むだけです。したがって、ファイルfは、echo呼び出しによって切り捨てられることはありません。

標準出力をファイル記述子にリダイレクトする場合、構文は>&nです。ここで、nはファイル記述子を示す小さな正の整数です(>>&nリダイレクトはありません)。これを機能させるには、ファイル記述子をすでに開いているファイルに関連付けておく必要があります。ファイルを切り捨てるのはファイルを開く行為であり、ファイルをexec 3>fで記述子に関連付けます(exec 3>>fはファイルを切り捨てず、追加で開きます) -モード)。 >&3で書き込むだけでは、ファイルは開かれず、切り捨てられません。

あなたがやったなら、それは違っていただろう

echo foo >f
echo bar >f
cat f

(各echofを開いて切り捨てています)、または、より複雑ですが、

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

(ファイルは各execの前にechoによって開かれ、切り捨てられます)。

19
Kusalananda