Внутренняя логика цепочечных перенаправлений

Внутренняя логика цепочечных перенаправлений

Когда я печатаю

cat some_file > new_file1 > new_file2

Я получил вывод из some_filein new_file2и пустой new_file1.

Какая в нем внутренняя логика? А точнее, что такое stdoutфайл?

Примечание: в Windows средний файл пропускается.

решение1

Это зависит от оболочки.

В bash echo derp >file1 >file2сначала открывается file1, обрезается, затем подготавливается к stdoutзаписи echo derpв file1. Затем bash делает то же самое для file2: он открывает file2, обрезается и подготавливается к stdoutзаписи echo derpв file2.

В результате это file1усекается (т. е. содержимое удаляется) и stdoutпопадает только в file2. Цепочки не происходит. Bash может перенаправлять stdout только в одно место за раз. Это справедливо и для каналов: echo derp > file | catрезультаты в "derp" записываются в файл, а не в канал.

В zsh, однако, echo derp >file1 >file2пишет в оба file1и file2, как вы могли интуитивно ожидать. Смотрите MULTIOS man zshmiscдля получения подробной информации, если вы используете zsh.

Чтобы добиться этого за пределами zsh, можно просто использовать tee: echo derp | tee file1 file2 > /dev/nullэто эквивалентно echo derp >file1 >file2.

Связанный контент