Разница между $(git ls-files -s | wc -l) и $(git ls-files -s >out && wc -l <out)
Являются ли две команды $(git ls-files -s | wc -l)
а также $(git ls-files -s >out && wc -l <out)
разные или такие же, как когда первый пишется во второй форме, я получаю ошибки.
1 ответ
Когда вы передаете вывод одной программы на вход другой, как в:
$(git ls-files -s | wc -l)
... программы работают одновременно. wc
начнёт считать строки, как только получит их. Труба также направляет вывод git
на вход wc
без какого-либо промежуточного файла.
Обратите внимание, что в этом случае wc
будет работать, даже если git
по какой-то причине команда не выполняется, поэтому вы получите wc
вывод (в большинстве случаев 0
).
В вашем втором примере:
$(git ls-files -s >out && wc -l <out)
... git
Команда запускается первой и сохраняет результаты в файле с именем out
, Тогда, если это было успешно, wc
работает и считает линии. Потому что &&
если git
команда терпит неудачу, wc
не будет работать вообще. В любом случае у вас будет файл с именем out
лежать с результатами git
Команда в этом.
Трубопровод обычно лучше; он будет работать быстрее, и если вам не нужно сохранять промежуточные результаты, у него не будет никаких побочных эффектов.