この作品を見ると:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
bashがfにコンテンツを追加するのはなぜですか?私は何を逃したことがありませんか?
答え1
あなたが逃したのは、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
。)