Editar:¿El lado izquierdo de la tubería es la subescola?
Mi comentario más abajo con respecto sed '[email protected]^@ @' <(f1)
es incorrecta Mientras $BASH_SUBSHELL
indica que estamos en el mismo nivel que la puesta en marcha, las variables se pierden en el script principal. según la respuesta de Gordons Probé f1 > >(sed '[email protected]^@ @')
y parece que funciona correctamente. Aún así, ¿BASH_SUBSHELL no debería ser 1 y no 0 para la primera forma?
considerar esta pequeña prueba
#!/bin/bash
declare -i i=0
function f1()
{
let i++
echo "In f1, SUBSHELL: $BASH_SUBSHELL, i=$i" >&2
}
f1
f1 | sed '[email protected]^@ @'
echo "at end, i=$i"
con el siguiente resultado:
In f1, SUBSHELL: 0, i=1
In f1, SUBSHELL: 1, i=2
at end, i=1
(el propósito de la sed
es sólo para tener una tubería a algo, no lo espera hacer cualquier cosa porque las salidas f1 a stderr)
La función f1 registra el BASH_SUBSH actual ELL y el valor actual de i
sé por qué al final de la secuencia de comandos que obtenemos i=1
, es porque la segunda invocación estaba en un subnivel, y se perdió el valor de i en el subnivel 1.
Lo que no sé es por qué el lado izquierdo de la tubería no se ejecuta en el shell actual
Aunque me di cuenta de que podía evitar esto con sed '[email protected]^@ @' <(f1)
me gustaría saber por qué el lado izquierdo es no en el mismo nivel que el script principal
Creo que se permite que el caparazón tenga ambos extremos del tubo en la subcamada – sehe
Un Google rápido encontró esto: http://www.linuxprogrammingblog.com/pipe-in-bash-can-be-a-trap –
@ Brian ese artículo no discute el lado IZQUIERDO de la tubería ...Ya sé que son malas noticias para las asignaciones variables en el lado derecho de una tubería – nhed