Ejemplo:
ls | echono imprime nada (una línea en blanco, en realidad). Esperaría que imprima una lista de archivos.
ls | grep 'foo', por otro lado, funciona como se esperaba (imprime archivos con 'foo' en su nombre).
Lo que hago en estas situaciones es algo así como:
ls | while read OUT; do echo $OUT; donepero esto es bastante engorroso.
¿Por qué la tubería funciona con algunos comandos, pero no con otros? ¿Cómo puedo evitar este problema?

ls | echohacer? ¿Por qué no simplemente correrls?git cat-file, pero simplemente no funcionó. Aparentemente, echo tiene el mismo comportamiento, así que lo usé como ejemplo.Respuestas:
Hay una distinción entre argumentos de línea de comando y entrada estándar. Una tubería conectará la salida estándar de un proceso a la entrada estándar de otro. Entonces
Conecta la salida estándar de ls a la entrada estándar de eco. Bien verdad? Bueno, echo ignora la entrada estándar y volcará sus argumentos de línea de comando, que en este caso no son ninguno, su propio stdout. La salida: nada en absoluto.
Hay algunas soluciones en este caso. Una es usar un comando que lea stdin y vuelque a stdout, como cat.
"Funcionará", dependiendo de cuál sea su definición de trabajo.
Pero qué pasa con el caso general. Lo que realmente desea es convertir stdout de un comando en argumentos de línea de comando de otro. Como otros han dicho,
xargses la herramienta auxiliar canónica en este caso, leer sus argumentos de línea de comando para un comando desde su stdin y construir comandos para ejecutar.También puedes convertir esto un poco, usando el comando de sustitución
$()También haría lo que quieras.
Ambas herramientas son bastante básicas para las secuencias de comandos de shell, debe aprender ambas.
Para completar, como se indica en la pregunta, la otra forma básica de convertir stdin a args de línea de comando es el
readcomando incorporado del shell . Convierte "palabras" (palabras definidas por laIFSvariable) en una variable temporal, que puede usar en cualquier ejecución de comandos.fuente
ls | echoimprime solo una línea en blanco porqueechono lee ninguna entrada; el último comando de la canalización es en realidadechoque imprime nada más que una línea en blanco.Generalmente:
se asegura de que la salida de se
aconvierta en la entrada deb. Te sugiero que leas laPipelinessección deman bash.Si realmente quieres usar
lsyechojuntos, aquí hay algunos ejemplos (bastante inútiles):fuente
Si quieres
echoellscomando prueba:Esto llamará
echocon la salida dels.fuente
ls | xargs -I {} echo {}si desea que se llame para cada línea individualmente¿Por qué no simplemente usar:
O mucho más seguro:
fuente
echo *.