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


8

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オプションまたはリダイレクト演算子の微調整があるかどうか疑問に思っていました。何か案は?


どのような場合link.txtへのリンクである/dir/fileところ/dir、あなたが書き込みと検索権限を持っているに型ディレクトリのファイルであるが、/dir/file存在しない(とリダイレクションは、エラーメッセージを表示せずに、それを作成しますが)?どのような場合について/dir/file存在するが、通常のファイルではありません(デバイス、FIFO、ディレクトリ...)、またはあなたはそれへの書き込み権限を持っているか、許可を検索しませんか/dir
ステファンChazelas

回答:


7

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

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

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

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

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


1
私の質問のポイントは、私が書くしようとしていないよということであった何でも。という新しいファイルを作成したいのですlink.txtが、同じ場所にシンボリックリンクがあります。これを質問の形にするには、次の行でファイルを上書きするのであれば、なぜテストに煩わされるのでしょうか。私はただ行うrm -fことができ、同じ効果があります。
itadok 2018年

3
@itsadokああ。はい。rm -f filenameリダイレクトでそれに書き込む前に行うこともあなたの問題を解決するでしょう。ただし、それを現在のディレクトリに配置するか、シンボリックリンクのエンドポイントが配置されているディレクトリに配置するかによっても異なります。
クサラナンダ

rmファイルへのアクセス許可またはファイルへの書き込み権限が不足している可能性があります。多くの場合と同様に、すべてを準備することはできません。あなたは本当に期待している例を評価する必要がある(場合でも、ごくまれなど)、あなたが意図的にそれらを処理し、あなたがない場合、一定量があることを受け入れないようにそう考える例ゆえハンドル、ない考慮し、したがって処理できません。
Alfe、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.