Разница между $(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 Команда в этом.

Трубопровод обычно лучше; он будет работать быстрее, и если вам не нужно сохранять промежуточные результаты, у него не будет никаких побочных эффектов.

Другие вопросы по тегам