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

<p>пример:</p><p><code>ls | echo</code> ничего не печатает (фактически пустая строка). я ожидаю, что это напечатает список файлов.</p><p><code>ls | grep 'foo'</code>, с другой стороны, работает как положено (печатает файлы с именем 'foo').</p><p>в этих ситуациях я делаю что-то вроде: <code>ls | while read out; do echo $out; done, но это довольно громоздко.почему конвейер работает с некоторыми командами, но не с другими? как я могу обойти эту проблему?

существует различие между аргументами командной строки и стандартным вводом. канал соединит стандартный вывод одного процесса со стандартным вводом другого. такls | echo подключает стандартный вывод ls к стандартному вводу эха. хорошо верно? что ж, echo игнорирует стандартный ввод и выводит свои аргументы командной строки (которых в данном случае нет) в свой собственный стандартный вывод. выход: вообще ничего.в этом случае есть несколько решений. одним из них является использование команды, которая читает stdin и создает дамп в stdout, например, cat.ls | cat будет «работать», в зависимости от вашего определения работы.но как насчет общего случая. что вам действительно нужно, так это преобразовать стандартный вывод одной команды в аргументы командной строки другой. как уже говорили другие, xargs в этом случае - канонический вспомогательный инструмент, считывающий аргументы командной строки для команды из своего стандартного ввода и создающий команды для запуска.ls | xargs echo вы также можете преобразовать это, используя команду подстановки $()</code></p><pre><code>echo $(ls) также будет делать то, что вы хотите.оба эти инструмента являются ядром сценариев shell, вы должны изучить оба.для полноты, как вы указали в вопросе, другой базовый способ преобразования stdin в аргументы командной строки - встроенная в оболочку команда read. он преобразует «слова» (слова, как определено в переменной ifs) во временную переменную, которую вы можете использовать при любом запуске команды.

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 </code></pre>

<p>если вы хотите <code>echo</code>, команда <code>ls</code> попробуйте:</p><pre><code>ls | xargs echo </code></pre><p>это вызовет <code>echo</code> с выводом <code>ls</code>.</p>

<p>почему бы просто не использовать:</p><pre><code>echo `ls` </code></pre><p>или намного безопаснее:</p><pre><code>echo "`ls -lrt`" </code></pre>