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
)をテストします。シンボリックリンクですがファイルを参照していない場合は削除してください。