Что происходит, когда вы делаете
some_command >>file 2>>file
заключается в том, что file
будет открыто для добавления дважды. Это безопасно делать в файловой системе POSIX. Любая запись, которая происходит с файлом, когда он открыт для добавления, будет происходить в конец файла, независимо от того, поступают ли данные через стандартный поток вывода или стандартный поток ошибок.
Это зависит от поддержки операций записи с атомарным добавлением в базовой файловой системе. Некоторые файловые системы, такие как NFS, не поддерживают атомарное добавление. См., например. вопрос «Является ли добавление файла атомарным в UNIX? " на StackOverflow.
Использование
some_command >>file 2>&1
Однако
будет работать даже в NFS.
Однако, используя
some_command >file 2>file
небезопасно, так как оболочка будет обрезать выходной файл (дважды ), и любая запись, происходящая в любом потоке, перезапишет данные, уже записанные другим потоком.
Пример:
$ { echo hello; echo abc >&2; } >file 2>file
$ cat file
abc
o
Сначала записывается строка hello
(с завершающим символом новой строки ), а затем из стандартной ошибки записывается строка abc
, за которой следует символ новой строки, перезаписывая hell
. Результатом является строка abc
с новой строкой, за которой следует то, что осталось от первого вывода echo
, o
и новая строка.
Поменяв местами два echo
вокруг раны, мы получим только hello
в выходном файле, так как эта строка записывается последней и длиннее, чем строка abc
. Порядок, в котором происходят перенаправления, не имеет значения.
Было бы лучше и безопаснее использовать более идиоматичное
some_command >file 2>&1