Existe una distinción entre los argumentos de la línea de comandos y la entrada estándar. Una tubería conectará la salida estándar de un proceso con la entrada estándar de otro. Así que
ls | echo
Conecta la salida estándar de ls con la entrada estándar de echo. ¿Está bien, verdad? Pues bien, echo ignora la entrada estándar y volcará sus argumentos de línea de comandos -que no son ninguno en este caso- a su propia salida estándar. La salida: nada en absoluto.
Hay algunas soluciones en este caso. Una es utilizar un comando que lea stdin y vuelque a stdout, como cat.
ls | cat
“Funcionará”, dependiendo de cuál sea su definición de trabajo.
Pero qué pasa con el caso general. Lo que realmente quieres es convertir la salida estándar de un comando en los argumentos de la línea de comandos de otro. Como otros han dicho, xargs
es la herramienta de ayuda canónica en este caso, leyendo sus argumentos de línea de comandos para un comando desde su stdin, y construyendo comandos para ejecutar.
ls | xargs echo
También podrías convertir esto en algo, usando el comando de sustitución $()
echo $(ls)
También haría lo que quieres.
Ambas herramientas son muy importantes para el shell scripting, deberías aprender ambas.
Para completar, como indicas en la pregunta, la otra forma básica de convertir stdin en argumentos de línea de comandos es el comando read
incorporado en el shell. Convierte las “palabras” (palabras definidas por la variable IFS
) en una variable temporal, que puedes utilizar en cualquier ejecución de comandos.