Почему поведение `command 1> file.txt 2> file.txt` отличается от` command 1> file.txt 2> & 1`?

Рассмотрите возможность использования grc.zsh это часть grc , которую можно найти здесь . У него есть псевдонимы для всех поддерживаемых команд.
См. Этот ответ Stackoverflow

20
12.09.2017, 17:51
2 ответа

Вам нужно знать две вещи:

  • Открытый дескриптор файла , известный на стороне режима приложения -процесса, ссылается на внутренний объект ядра, известный как описание файла , который является экземпляром открытого файла.. В файле может быть несколько описаний файлов, а также несколько файловых дескрипторов, разделяющих описание файла.
  • Текущая позиция в файле является атрибутом описания файла . Таким образом, если несколько файловых дескрипторов сопоставляются с одним описанием файла, все они совместно используют одну и ту же текущую позицию в файле, и изменение позиции в файле, выполненное с использованием одного такого файлового дескриптора, влияет на все остальные такие файловые дескрипторы.

    Такие изменения инициируются процессами, вызывающими read()/readv(), write()/writev(), lseek()и подобными системными вызовами. Команда echo, конечно же, вызывает write()/ writev().

Вот что происходит:

  • command 1>file.txt 2>&1создает только одно описание файла, потому что оболочка открывает файл только один раз. Оболочка делает и стандартным выводом, и стандартные дескрипторы файлов ошибок сопоставляются с этим единственным описанием файла. Он дублирует стандартный вывод на стандартную ошибку. Таким образом, запись через любой файловый дескриптор будет перемещать общую текущую позицию файла :, каждая запись идет после предыдущей записи общего описания файла. И, как вы видите, результаты команд echoне перезаписывают друг друга.
  • command 1>file.txt 2>file.txtсоздает два описания файлов, поскольку оболочка дважды открывает один и тот же файл в ответ на два явных перенаправления.Дескрипторы стандартного вывода и стандартного файла ошибок сопоставляются с двумя разными описаниями файлов, которые, в свою очередь, сопоставляются с одним и тем же файлом. Два описания файлов имеют совершенно независимые текущие позиции в файле, и каждая запись сразу же идет за предыдущей записью в том же описании файла. И, как вы можете видеть, в результате то, что записывается через один, может перезаписывать то, что записывается через другой, различными способами в зависимости от того, в каком порядке вы выполняете запись.

Дополнительная литература

44
27.01.2020, 19:43

Использование >указывает перезаписать файл. Поскольку у вас есть stdout и stderr, записывающие в файл двумя разными операциями, последняя запись перезапишет первую.

Вы можете:

command 1>>file.txt 2>>file.txt

или

command &>file.txtТолько bash v4 и выше.

>>говорит ему добавить файл, чтобы он не заменял вывод предыдущих операций.

&>просто проще написать2>&1

16
27.01.2020, 19:43

Теги

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