Как указать BusID для всех устройств фреймбуфера в freebsd?

Что происходит, когда вы делаете

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

-1
19.07.2021, 02:11
0 ответов

Теги

Похожие вопросы