Вам нужно знать две вещи:
Такие изменения инициируются процессами, вызывающими read()
/readv()
, write()
/writev()
, lseek()
и подобными системными вызовами. Команда echo
, конечно же, вызывает write()
/ writev()
.
Вот что происходит:
command 1>file.txt 2>&1
создает только одно описание файла, потому что оболочка открывает файл только один раз. Оболочка делает и стандартным выводом, и стандартные дескрипторы файлов ошибок сопоставляются с этим единственным описанием файла. Он дублирует стандартный вывод на стандартную ошибку. Таким образом, запись через любой файловый дескриптор будет перемещать общую текущую позицию файла :, каждая запись идет после предыдущей записи общего описания файла. И, как вы видите, результаты команд echo
не перезаписывают друг друга. command 1>file.txt 2>file.txt
создает два описания файлов, поскольку оболочка дважды открывает один и тот же файл в ответ на два явных перенаправления.Дескрипторы стандартного вывода и стандартного файла ошибок сопоставляются с двумя разными описаниями файлов, которые, в свою очередь, сопоставляются с одним и тем же файлом. Два описания файлов имеют совершенно независимые текущие позиции в файле, и каждая запись сразу же идет за предыдущей записью в том же описании файла. И, как вы можете видеть, в результате то, что записывается через один, может перезаписывать то, что записывается через другой, различными способами в зависимости от того, в каком порядке вы выполняете запись. Начиная с Centos 8.1, ПК вернулись. Просто включите репозиторий Centos -HA.