Пример:
ls | echo
ничего не печатает (фактически пустая строка). Я ожидаю, что это напечатает список файлов.
ls | grep 'foo'
с другой стороны, работает как положено (печатает файлы с именем 'foo').
В этих ситуациях я делаю что-то вроде:
ls | while read OUT; do echo $OUT; done
но это довольно громоздко.
Почему конвейер работает с некоторыми командами, но не с другими? Как я могу обойти эту проблему?
ls | echo
сделать? почему бы просто не бежатьls
?git cat-file
, но он просто не работал. Очевидно, что у echo такое же поведение, поэтому я использовал его в качестве примера.Ответы:
Существует различие между аргументами командной строки и стандартным вводом. Канал соединит стандартный вывод одного процесса со стандартным вводом другого. Так
Подключает стандартный вывод ls к стандартному вводу эха. Хорошо верно? Что ж, echo игнорирует стандартный ввод и выводит свои аргументы командной строки (которых в данном случае нет) в свой собственный стандартный вывод. Выход: вообще ничего.
В этом случае есть несколько решений. Одним из них является использование команды, которая читает stdin и создает дамп в stdout, например, cat.
Будет «работать», в зависимости от вашего определения работы.
Но как насчет общего случая. Что вам действительно нужно, так это преобразовать стандартный вывод одной команды в аргументы командной строки другой. Как уже говорили другие,
xargs
является ли в этом случае каноническим вспомогательным инструментом, считывая аргументы командной строки для команды из своего стандартного ввода и создавая команды для запуска.Вы также можете преобразовать это, используя команду замещения
$()
Также будет делать то, что вы хотите.
Оба эти инструмента являются довольно ядром сценариев оболочки, вы должны изучить оба.
Для полноты, как вы указали в вопросе, другой базовый способ преобразования stdin в аргументы командной строки - встроенная
read
команда оболочки . Он преобразует «слова» (слова, как определено вIFS
переменной) во временную переменную, которую вы можете использовать при любом запуске команды.источник
ls | echo
печатает только пустую строку, потому что неecho
читает ввод; последняя команда конвейера на самом делеecho
выводит только пустую строку.В общем:
удостоверяется, что выходные данные
a
становятся входными даннымиb
. Я предлагаю вам прочитатьPipelines
разделman bash
.Если вы действительно хотите использовать
ls
иecho
вместе вот некоторые (довольно бесполезные) примеры:источник
Если вы хотите
echo
вls
командной попытке:Это вызовет
echo
с выводомls
.источник
ls | xargs -I {} echo {}
если вы хотите, чтобы он вызывался для каждой строки индивидуальноПочему бы просто не использовать:
Или намного безопаснее:
источник
echo *
.