Например

echo Something >> SomeFile

Я хочу, чтобы это добавление работало, только если SomeFile уже существует.

Сейчас я использую следующее:

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

Но здесь должно быть условие гонки. Во время оценки условия if может существовать SomeFile. Переключение контекста происходит между условием if и добавлением. Выполняется какое-то другое приложение, которое удаляет SomeFile. В этом случае добавление создаст SomeFile.

Мне нужно, чтобы решение работало как для bsd sed, так и для gnu sed.


Это довольно просто сделать в python с помощью os.open и 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
2
Hakan Baba 19 Ноя 2017 в 09:22
Я не думаю, что смогу добиться этого с помощью >> (перенаправление вывода). Согласно эта операция >> открывает файлы с O_CREAT.
 – 
Hakan Baba
19 Ноя 2017 в 09:25

1 ответ

Я думаю, что это должно выполнить то, что вы хотите:

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

Я сделал это с mac osx/bsd sed, поэтому вы можете удалить часть -i ''. Это не удастся, если SomeFile не существует, однако предостережение в том, что это также не удастся, если файл существует и имеет размер 0 байтов, надеюсь, это не станет для вас препятствием.

1
jesse_b 19 Ноя 2017 в 01:58
Я мало использовал sed, за исключением простой замены s/../../g. Так что извините за неграмотные вопросы. Для gnu-sed мне нужно было удалить '', но не -i. Но в этом случае gnu-sed добавляет еще одну дополнительную строку после Something Вам нужна последняя новая строка в сценарии sed? Я думаю, что могу обойти проблему с 0 байтами. Я могу сделать так, чтобы файл содержал новую строку в начале, а не был пустым. Почему эта команда является NOOP для пустых файлов? Это потому, что sed основан на строках и пропускает обработку, если не может найти ни одной строки?
 – 
Hakan Baba
19 Ноя 2017 в 09:17
Моя проблема с этим решением - переносимость. Мне нужно решение для работы в BSD и в Linux. Я обновлю вопрос соответственно. Не должно быть слишком сложно изменить параметры и сценарий sed, чтобы генерировать один и тот же вывод для bsd и gnu seds.
 – 
Hakan Baba
19 Ноя 2017 в 09:19