
Когда я печатаю
cat some_file > new_file1 > new_file2
Я получил вывод из some_file
in 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
.