Bashでは、コマンドリンク
echo test > actual.txt
actual.txt
というファイルの内容を "test"に置き換え、ファイルが存在しない場合は作成します。ただし、ファイルが存在する場合、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オプションのTweakまたはリダイレクトオペレーターがいくつかあるかどうか疑問に思っていました。何か案は?
無効なシンボリックリンクに書き込もうとすることは、存在しないパスに書き込もうとすることと同じです。 bash
にパス(中間ディレクトリを含む)を作成するために出力リダイレクトを「微調整」する方法はなく、bash
にはこれを自動化するシェルオプションはありません。
中間パスは存在するが、リンクのエンドポイントが存在しない場合は、リダイレクトによって作成されます。
あなたは次のようなことをするかもしれません
if [ -h file ] && [ ! -f file ]; then
rm file
fi
「ファイル」がシンボリックリンクかどうかをテストする(-h
)および存在する通常のファイルを参照するかどうか(-f
)。シンボリックリンクであるがファイルを参照していない場合は、削除します。