Рассмотрите возможность использования grc.zsh
это часть grc
, которую можно найти здесь . У него есть псевдонимы для всех поддерживаемых команд.
См. Этот ответ Stackoverflow
Вам нужно знать две вещи:
Такие изменения инициируются процессами, вызывающими read()
/readv()
, write()
/writev()
, lseek()
и подобными системными вызовами. Команда echo
, конечно же, вызывает write()
/ writev()
.
Вот что происходит:
command 1>file.txt 2>&1
создает только одно описание файла, потому что оболочка открывает файл только один раз. Оболочка делает и стандартным выводом, и стандартные дескрипторы файлов ошибок сопоставляются с этим единственным описанием файла. Он дублирует стандартный вывод на стандартную ошибку. Таким образом, запись через любой файловый дескриптор будет перемещать общую текущую позицию файла :, каждая запись идет после предыдущей записи общего описания файла. И, как вы видите, результаты команд echo
не перезаписывают друг друга. command 1>file.txt 2>file.txt
создает два описания файлов, поскольку оболочка дважды открывает один и тот же файл в ответ на два явных перенаправления.Дескрипторы стандартного вывода и стандартного файла ошибок сопоставляются с двумя разными описаниями файлов, которые, в свою очередь, сопоставляются с одним и тем же файлом. Два описания файлов имеют совершенно независимые текущие позиции в файле, и каждая запись сразу же идет за предыдущей записью в том же описании файла. И, как вы можете видеть, в результате то, что записывается через один, может перезаписывать то, что записывается через другой, различными способами в зависимости от того, в каком порядке вы выполняете запись. Использование >
указывает перезаписать файл. Поскольку у вас есть stdout и stderr, записывающие в файл двумя разными операциями, последняя запись перезапишет первую.
Вы можете:
command 1>>file.txt 2>>file.txt
или
command &>file.txt
Только bash v4 и выше.
>>
говорит ему добавить файл, чтобы он не заменял вывод предыдущих операций.
&>
просто проще написать2>&1