Istnieje rozróżnienie pomiędzy argumentami wiersza poleceń a standardowym wejściem. Potok połączy standardowe wyjście jednego procesu ze standardowym wejściem innego. Tak więc
ls | echo
łączy standardowe wyjście ls ze standardowym wejściem echo. Dobrze, prawda? Cóż, echo ignoruje standardowe wejście i wyrzuca swoje argumenty wiersza poleceń - które w tym przypadku są żadne - na swoje własne stdout. Wyjście: zupełnie nic.
W tym przypadku istnieje kilka rozwiązań. Jednym z nich jest użycie polecenia, które czyta stdin i wyrzuca na stdout, takiego jak cat.
ls | cat
Będzie “działać”, w zależności od tego, jaka jest twoja definicja pracy.
Ale co z ogólnym przypadkiem. To, czego naprawdę chcesz, to przekonwertować stdout jednego polecenia na argumenty wiersza poleceń innego. Jak powiedzieli inni, xargs
jest kanonicznym narzędziem pomocniczym w tym przypadku, czytając swoje argumenty wiersza poleceń dla polecenia z jego stdin i konstruując polecenia do uruchomienia.
ls | xargs echo
Możesz również przekonwertować to trochę, używając polecenia podstawienia $()
echo $(ls)
Zrobiłoby to, co chcesz.
Oba te narzędzia są dość kluczowe dla skryptów powłoki, powinieneś się ich nauczyć.
Dla kompletności, jak wskazujesz w pytaniu, innym podstawowym sposobem konwersji stdin na argumenty wiersza poleceń jest wbudowane polecenie read
powłoki. Konwertuje ono “słowa” (słowa zdefiniowane przez zmienną IFS
) na zmienną temp, której możesz użyć w dowolnym uruchomieniu polecenia.