#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
no produce ninguna salida porque las tuberías corren cada uno de sus componentes dentro de una subcapa. Las subcapas heredan copias de las variables del shell principal, en lugar de compartirlas. Prueba esto:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
Los paréntesis definen una región de código que se ejecuta en un subnivel, y $ foo conserva su valor original después de ser modificado en su interior.
Ahora intente esto:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
Los frenos son puramente para la agrupación, no se crea un subnivel, y los $ foo modificado dentro de las llaves es el mismo $ foo modificado fuera de ellas.
Ahora intente esto:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
Entre las llaves, la lectura orden interna crea $ var1 y var2 $ adecuadamente y se puede ver que consiguen hicieron eco. Fuera de las llaves, ya no existen. Todo el código dentro de las llaves ha sido ejecutado en una subcategoría porque es un componente de una tubería.
Puede poner cantidades arbitrarias de código entre llaves, por lo que puede usar esta construcción de tubería en un bloque cada vez que necesite ejecutar un bloque de script de shell que analiza el resultado de otra cosa.
Esto depende de la elección de la cáscara. Ksh93 fue diseñado para limitar la sobrecarga del proceso.También ejecuta el elemento final de una interconexión * dentro * del proceso invocador de shell, conservando así el estado. –
Bash 4.2 introdujo una opción para hacer lo mismo. Desactive el control de trabajos ('set + m') y configure la opción' lastpipe' ('shopt -s lastpipe'). – chepner
Lo investigaré. ¡Gracias! –