Как объединить и передать результаты двух разных команд в одну команду?

Я хочу объединить (объединить) выходные данные двух разных команд и передать их одной команде.

Глупый пример:

Команды, которые я хочу объединить:

cat wordlist.txt
ls ~/folder/*

в:

wc -l

В этом примере, если wordlist.txt содержит 5 строк и 3 файла, я хочу, чтобы wc -l вернул 8.

$cat wordlist.txt *[magical union thing]* ls ~/folder/* | wc -l
8

Как мне это сделать?

34
задан 7 May 2012 в 23:05

3 ответа

Ваш волшебной вещью объединения является точка с запятой... и фигурные скобки:

    { cat wordlist.txt ; ls ~/folder/* ; } | wc -l

круглая скобка только собирает в группу команды, так, чтобы знак | канала влиял на объединенный вывод.

можно также использовать круглую скобку () вокруг оперативной группы штаба, которая выполнила бы команды в подоболочке. Это имеет тонкий набор различий с фигурными скобками, например, попробуйте приведение в исполнение:

    cd $HOME/Desktop ; (cd $HOME ; pwd) ; pwd
    cd $HOME/Desktop ; { cd $HOME ; pwd ; } ; pwd

Вы будете видеть, что все переменные среды, включая текущий рабочий каталог, сбрасываются после выхода из группы круглой скобки, но не после выхода из группы курчавой фигурной скобки.

Что касается точки с запятой, альтернативы включают && и || знаки, которые условно выполнят вторую команду, только если первое успешно или в противном случае соответственно, например,

    cd $HOME/project && make
    ls $HOME/project || echo "Directory not found."
52
ответ дан 7 May 2012 в 23:05

С тех пор wc принимает путь к файлу как вход, можно также использовать замену процесса:

wc -l <(cat wordlist.txt; ls ~/folder/*)

Это примерно эквивалентное:

echo wordlist.txt > temp
ls ~/folder/* >> temp
wc -l temp

Мышление, что ls ~/folder/* также возвраты содержание подкаталогов, если любой (из-за расширения шарика). Если Вы просто хотите перечислить содержание ~/folder, просто используйте ls ~/folder.

8
ответ дан 7 May 2012 в 23:05

Я спрашивал меня тот же вопрос и закончил тем, что писал короткий сценарий.

magicalUnionThing (Я называю его append):

#!/bin/sh
cat /dev/stdin
$*

Сделайте тот исполняемый файл сценария

chmod +x ./magicalUnionThing

Теперь Вы делаете

cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l

Что это делает:

  • Отправьте стандартный вход в стандартный вывод
  • Выполните аргумент. $* возвраты все аргументы как строка. Вывод той команды переходит к стандартному выводу сценария по умолчанию.

Таким образом, stdout magicalUnionThing будет своим stdin + stdout команды, которая передается как аргумент.

Существуют, конечно, более простые пути согласно другим ответам.
Возможно, эта альтернатива может быть полезной в некоторых случаях.

2
ответ дан 23 November 2019 в 00:27

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

Похожие вопросы: