Bash:ファイルにリダイレクトし、常に新しいファイルを作成します。

Bash:ファイルにリダイレクトし、常に新しいファイルを作成します。

Bashのコマンドリンク

echo test > actual.txt

呼び出されたファイルの内容を「test」に置き換えて、ファイルが存在しない場合はactual.txt作成します。ただし、ファイルが存在する場合、bashはそのファイルを開いて切り取り、ファイルに新しい内容を書き込みます。

特に、次の場合、リダイレクトコマンドは失敗します。

ln -s /some/illegal/path link.txt
echo test > link.txt

Bash 4.4.12では、混乱したエラーメッセージが表示されますlink.txt: No such file or directory

これを防止する1つの方法は、リダイレクトコマンドを実行する前にファイルを削除することです。

rm link.txt && echo test > link.txt

しかし、この失敗モードを防ぐために、bashオプションまたはリダイレクト演算子を少し調整できるかどうかを知りたいです。どんなアイデアがありますか?

答え1

死んだシンボリックリンクに書き込もうとするのは、存在しないパスに書き込もうとするのと同じです。でパス(中間ディレクトリを含む)を生成するために出力リダイレクトを「調整」する方法はなく、このプロセスを自動化するbashシェルオプションもありません。bash

中間パスが存在するがリンクのエンドポイントがない場合は、リダイレクトによって生成されます。

次のようなことができます

if [ -h file ] && [ ! -f file ]; then
    rm file
fi

「ファイル」がシンボリックリンクか(-h)、既存の一般ファイルを参照しているか(-f)をテストします。シンボリックリンクですがファイルを参照していない場合は削除してください。

関連情報