В POSIX-совместимой файловой системе (ext4, XFS и т. Д. c) в режиме O_APPEND
(что дает вам >>
), независимо от того, сколько у вас процессов, запись всегда будет go в дно; более того, , если эти записи помещаются на одной странице памяти, нет риска, что они будут разбиты на несколько отдельно добавляемых компонентов.
Таким образом, это небезопасно:
exec >>somefile # redirects all future stdout to somefile in O_APPEND mode
printf %s 'Hello' # BUGGY: Writing less than a line, so you can get split at this point
echo ' World'
... и вот так:
exec >somefile # truncate file and make all future writes go to it, NOT in O_APPEND mode
echo "Hello World" # BUGGY: Not opened with O_APPEND, so our file pointer may not be
# ...at the end after other programs have been doing concurrent writes.
... но это является безопасным:
exec >>somefile # redirects all future stdout to somefile in O_APPEND mode
echo "Hello World" # SAFE: Writing a complete line, less than 4kb, in O_APPEND mode.
Есть оговорка, что если Ваши записи больше, чем страница (обычно 4 КБ), они могут быть разделены на несколько системных вызовов, но оставьте их короткими и убедитесь, что каждая из них содержит полную запись, и вы в безопасности.