bash - variable - La tubería no funciona con el comando echo
echo shell linux (4)
Esta pregunta ya tiene una respuesta aquí:
Cuando ejecute el siguiente script de Bash
, esperaría que se imprima Hello
. En su lugar, imprime una línea en blanco y sale.
echo ''Hello'' | echo
¿Por qué no funciona la salida de piping
de echo
a echo
?
Es porque echo
(tanto builtin como /bin/echo
) no leen nada desde stdin
.
Utilice cat
lugar:
echo ''Hello'' | cat
Hello
O sin tubos:
cat <<< ''Hello''
La canalización se puede hacer solo para los comandos que toman entradas de la entrada estándar. Pero el eco no toma de stdin. Tomará la entrada del argumento y lo imprimirá. Así que esto no funcionará. Para hacer eco puedes hacer algo como echo $(echo ''hello'')
Parece que no entiendes las tuberías. En este caso, se les conoce más correctamente como tuberías anónimas , porque no tienen nombre (también hay tuberías con nombre ). Las canalizaciones anónimas solo funcionan entre procesos relacionados, por ejemplo, procesos con el mismo padre.
Los conductos forman parte del sistema IO resultante de la biblioteca en tiempo de ejecución de C. Estas secuencias están en búfer (hay una excepción) de forma predeterminada. Básicamente, un conducto simplemente conecta el búfer de salida de un proceso al búfer de entrada de otro.
Las tres primeras secuencias utilizadas (denominadas descriptores de archivo ) están numeradas como 0, 1 y 2. La primera, 0, se conoce como entrada estándar o stdin
(el nombre utilizado en C). De forma predeterminada, está conectado al teclado, pero se puede redirigir utilizando el símbolo <
o el nombre del programa que se encuentra en el lado derecho de una canalización.
El segundo, 1, se conoce como salida estándar , o stdout
. De forma predeterminada, está conectado a la pantalla del terminal, pero puede redirigirse utilizando el símbolo >
o el nombre del programa que se encuentra en el lado izquierdo de una tubería.
Asi que:
echo ''Hello'' | echo
toma la salida estándar de echo
y la pasa a la entrada estándar de echo
. Pero el echo
no lee stdin! Así que no pasa nada.
Los programas de filtro procesan los nombres de archivos especificados en la línea de comandos. Si no se dan nombres de archivos, entonces leen stdin. Los ejemplos incluyen cat
, grep
y sed
, pero no echo
. Por ejemplo:
echo ''Hello'' | cat
mostrará "Hola", y el cat
es inútil (a menudo lo es).
echo ''Hello'' | cat file1
ignorará la salida de echo
y solo mostrará el contenido del archivo1. Recuerde que la entrada estándar solo se lee si no se da ningún nombre de archivo.
¿Qué crees que esto muestra?
echo ''Hello'' | cat < file1 file2
¿y por qué?
Finalmente, el tercer flujo, 2, se llama error estándar , o stderr
, y este no tiene búfer . Es ignorado por las tuberías, porque solo funcionan entre stdin y stdout. Sin embargo, puedes redireccionar stderr para usar stdout (ver man dup2
):
myprog 2>&1 | anotherprog
El 2>&1
significa "redirigir el descriptor de archivos 2 al mismo lugar que el descriptor de fie 1".
Lo anterior es un comportamiento normal, sin embargo, un programa puede anular todo eso si lo desea. Se podría leer desde el descriptor de archivos 2, por ejemplo. He omitido muchos otros detalles, incluidas otras formas de redirección, como la sustitución de procesos y los documentos aquí .
echo
imprime todos sus argumentos. No se lee de stdin
. Así que el segundo echo
imprime todos sus argumentos (ninguno) y sale, ignorando el Hello
en la stdin
.
Para un programa que lee su stdin
e imprime eso a stdout
, use cat
:
$ echo Hello | cat
Hello