Існує відмінність між аргументами командного рядка та стандартним введенням. Труба з'єднає стандартний вихід одного процесу зі стандартним входом іншого. Тому
ls | echo
Підключає стандартний вихід ls до стандартного вводу ехо. Чудово правильно? Ну, echo ігнорує стандартне введення та скидає аргументи командного рядка - яких у цьому випадку немає - власного stdout. Вихід: взагалі нічого.
У цьому випадку є кілька рішень. Одне полягає у використанні команди, яка читає stdin та dump для stdout, наприклад cat.
ls | cat
Чи буде "працювати", залежно від того, яке ваше визначення роботи.
А як щодо загальної справи. Те, що вам справді хочеться, це перетворити stdout однієї команди в аргументи командного рядка іншої. Як вже говорили інші, чи xargs
є в цьому випадку канонічним допоміжним інструментом, читаючи аргументи командного рядка для команди зі свого stdin та будуючи команди для запуску.
ls | xargs echo
Ви також можете це перетворити за допомогою команди підстановки $()
echo $(ls)
Також робиш те, що хочеш.
Обидва ці інструменти є ядром сценаріїв оболонок, ви повинні навчитися обом.
Для повноти, як ви вказуєте в питанні, інший базовий спосіб перетворення stdin в аргументи командного рядка - це вбудована read
команда оболонки . Він перетворює "слова" (слова, визначені IFS
змінною), в змінну temp, яку ви можете використовувати в будь-яких командах.
ls | echo
зробити? чому б просто не бігтиls
?