Пример:
ls | echo
печать ничто (пустая строка, на самом деле). Я ожидал бы, что это распечатает список файлов.
ls | grep 'foo'
, с другой стороны, работы как ожидалось (печатает файлы с 'нечто' на их имя).
То, что я делаю в этих ситуациях, является чем-то как: ls | while read OUT; do echo $OUT; done
но это является довольно громоздким.
Почему передача по каналу работает с некоторыми командами, но не с другими? Как я могу обойти эту проблему?
Существует различие между параметрами командной строки и стандартным входом. Канал соединит стандартный вывод одного процесса к стандартному входу другого. Так
ls | echo
Стандартный вывод подключений ls к стандартному входу эха. Прекрасное право? Ну, эхо игнорирует стандартный вход и выведет его параметры командной строки - которые не являются ни одним в этом случае к - его собственный stdout. Вывод: ничто вообще.
В этом случае существует несколько решений. Нужно использовать команду, которая читает stdin и выводит к stdout, такому как кошка.
ls | cat
Будет 'работать', в зависимости от того, каково Ваше определение работы.
Но что относительно общего случая. То, что Вы действительно хотите, должно преобразовать stdout одной команды к командной строке args другого. Поскольку другие сказали, xargs
канонический инструмент помощника в этом случае, читая его командную строку args для команды от его stdin, и создавая команды для выполнения.
ls | xargs echo
Вы могли также преобразовать это некоторые, с помощью команды замены $()
echo $(ls)
Также сделал бы то, что Вы хотите.
Оба из этих инструментов являются довольно базовыми для окружения сценариев, необходимо изучить обоих.
Для полноты, как Вы указываете в вопросе, другим основным способом преобразовать stdin в командную строку args является встроенная оболочка read
команда. Это преобразовывает "слова" (слова, как определено IFS
переменная) к временной переменной, которую можно использовать в любых выполнениях команды.
Если Вы хотите echo
ls
попытка команды:
ls | xargs echo
Это будет звонить echo
с выводом ls
.
ls | echo
печать просто пустая строка, потому что echo
чтения никакой вход; последняя команда конвейера на самом деле echo
это печатает только пустую строку.
Обычно:
a | b
удостоверяется что вывод a
станьте входом b
. Я предлагаю, чтобы Вы читали Pipelines
раздел man bash
.
Если Вы действительно хотите использовать ls
и echo
вместе вот некоторые (довольно бесполезные) примеры:
ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done