Существует различие между аргументами командной строки и стандартным вводом. Трубка будет соединять стандартный выход одного процесса со стандартным входом другого. Таким образом,
ls | echo
Подключает стандартный выход ls к стандартному входу эхо. Понятно? Ну, echo игнорирует стандартный вход и выдавливает свои аргументы командной строки - которых в данном случае нет - свой собственный stdout. Выход: совсем ничего.
В данном случае есть несколько решений. Одно из них - использовать команду, которая читает stdin и дает дамп к stdout, например cat.
ls | cat
Будет ‘работать’, в зависимости от того, какова ваша дефиниция работы.
А как же общий случай. На самом деле вы хотите преобразовать stdout одной команды в аргументы командной строки другой. Как говорили другие, xargs
в данном случае является каноническим вспомогательным инструментом, чтение его командной строки аргументирует выполнение команды из stdin, а также построение команд для выполнения.
ls | xargs echo
Вы также можете преобразовать это, используя команду замены $()
echo $(ls)
Would также делать то, что вы хотите.
Оба этих инструмента являются ядром сценариев оболочки, вы должны научиться и тому, и другому.
Для полноты, как вы указываете в вопросе, другим базовым способом преобразования stdin в аргументы командной строки является встроенная команда оболочки read
. Она преобразует “слова” (слова, определенные переменной IFS
) в переменную темпа, которую вы можете использовать при выполнении любой команды.