Я хочу объединить (объединить) выходные данные двух разных команд и передать их одной команде.
Глупый пример:
Команды, которые я хочу объединить:
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
Как мне это сделать?
Ваш волшебной вещью объединения является точка с запятой... и фигурные скобки:
{ 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."
С тех пор wc
принимает путь к файлу как вход, можно также использовать замену процесса:
wc -l <(cat wordlist.txt; ls ~/folder/*)
Это примерно эквивалентное:
echo wordlist.txt > temp
ls ~/folder/* >> temp
wc -l temp
Мышление, что ls ~/folder/*
также возвраты содержание подкаталогов, если любой (из-за расширения шарика). Если Вы просто хотите перечислить содержание ~/folder
, просто используйте ls ~/folder
.
Я спрашивал меня тот же вопрос и закончил тем, что писал короткий сценарий.
magicalUnionThing
(Я называю его append
):
#!/bin/sh
cat /dev/stdin
$*
Сделайте тот исполняемый файл сценария
chmod +x ./magicalUnionThing
Теперь Вы делаете
cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l
Что это делает:
$*
возвраты все аргументы как строка. Вывод той команды переходит к стандартному выводу сценария по умолчанию.Таким образом, stdout magicalUnionThing будет своим stdin + stdout команды, которая передается как аргумент.
Существуют, конечно, более простые пути согласно другим ответам.
Возможно, эта альтернатива может быть полезной в некоторых случаях.