Ejemplo:
ls | echo
no 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; done
pero esto es bastante engorroso.
¿Por qué la tubería funciona con algunos comandos, pero no con otros? ¿Cómo puedo evitar este problema?
ls | echo
hacer? ¿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,
xargs
es 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
read
comando incorporado del shell . Convierte "palabras" (palabras definidas por laIFS
variable) en una variable temporal, que puede usar en cualquier ejecución de comandos.fuente
ls | echo
imprime solo una línea en blanco porqueecho
no lee ninguna entrada; el último comando de la canalización es en realidadecho
que imprime nada más que una línea en blanco.Generalmente:
se asegura de que la salida de se
a
convierta en la entrada deb
. Te sugiero que leas laPipelines
sección deman bash
.Si realmente quieres usar
ls
yecho
juntos, aquí hay algunos ejemplos (bastante inútiles):fuente
Si quieres
echo
ells
comando prueba:Esto llamará
echo
con 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 *
.