web-dev-qa-db-ja.com

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

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またはリダイレクトオペレーターがいくつかあるかどうか疑問に思っていました。何か案は?

8
itsadok

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

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

あなたは次のようなことをするかもしれません

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

「ファイル」がシンボリックリンクかどうかをテストする(-h)および存在する通常のファイルを参照するかどうか(-f)。シンボリックリンクであるがファイルを参照していない場合は、削除します。

7
Kusalananda