Как передать вывод команды по каналу к другим командам?

Пример:

ls | echo печать ничто (пустая строка, на самом деле). Я ожидал бы, что это распечатает список файлов.

ls | grep 'foo', с другой стороны, работы как ожидалось (печатает файлы с 'нечто' на их имя).

То, что я делаю в этих ситуациях, является чем-то как: ls | while read OUT; do echo $OUT; done но это является довольно громоздким.

Почему передача по каналу работает с некоторыми командами, но не с другими? Как я могу обойти эту проблему?

84
задан 06.11.2013, 19:30

3 ответа

Существует различие между параметрами командной строки и стандартным входом. Канал соединит стандартный вывод одного процесса к стандартному входу другого. Так

ls | echo

Стандартный вывод подключений ls к стандартному входу эха. Прекрасное право? Ну, эхо игнорирует стандартный вход и выведет его параметры командной строки - которые не являются ни одним в этом случае к - его собственный stdout. Вывод: ничто вообще.

В этом случае существует несколько решений. Нужно использовать команду, которая читает stdin и выводит к stdout, такому как кошка.

ls | cat

Будет 'работать', в зависимости от того, каково Ваше определение работы.

Но что относительно общего случая. То, что Вы действительно хотите, должно преобразовать stdout одной команды к командной строке args другого. Поскольку другие сказали, xargs канонический инструмент помощника в этом случае, читая его командную строку args для команды от его stdin, и создавая команды для выполнения.

ls | xargs echo

Вы могли также преобразовать это некоторые, с помощью команды замены $()

echo $(ls)

Также сделал бы то, что Вы хотите.

Оба из этих инструментов являются довольно базовыми для окружения сценариев, необходимо изучить обоих.

Для полноты, как Вы указываете в вопросе, другим основным способом преобразовать stdin в командную строку args является встроенная оболочка read команда. Это преобразовывает "слова" (слова, как определено IFS переменная) к временной переменной, которую можно использовать в любых выполнениях команды.

120
ответ дан 07.12.2019, 08:01

Если Вы хотите echo ls попытка команды:

ls | xargs echo

Это будет звонить echo с выводом ls.

11
ответ дан 07.12.2019, 08:01

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
19
ответ дан 07.12.2019, 08:01

Теги

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