ファイルが存在しない場合、ファイルの追加が失敗するようにするには?

ファイルが存在しない場合、ファイルの追加が失敗するようにするには?

例えば

echo Something >> SomeFile

私はこの追加がすでに存在する場合にのみ機能したいと思いますSomeFile

今は以下を使用しています。

if [ -e SomeFile ]; then 
    echo Something >> SomeFile
fi; 

しかし、ここには競争条件がなければなりません。この期間中にSomeFile条件評価がある可能性があります。 if条件と追加の間でコンテキスト切り替えが発生します。他のアプリケーションを実行すると削除されますSomeFile。この場合、追加するとSomeFile

bsd sedとgnu sedの両方で動作するソリューションが必要です。


Pythonでこれを行うのはとても簡単です。オペレーティングシステムが開きますそしてO_APPEND

$ rm SomeFile
$ python -c "import os; print(os.open(\"SomeFile\",os.O_APPEND))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'SomeFile'
$ touch SomeFile
$ python -c "import os; print(os.open(\"SomeFile\",os.O_APPEND))"
3

答え1

私はこれがあなたが望むものを達成しなければならないと思います:

sed -i '' -e '$a\
Something\
' SomeFile

私はこれを行うためにmac osx / bsd sedを使用しているので、その部分を削除できます-i ''。ファイルが存在しない場合は失敗しますSomeFileが、ファイルが存在し、ゼロバイトの場合でも失敗することに注意してください。うまくいけば、これが大きな問題にならないことを願っています。

関連情報