bash - script - Establecer una variable de shell padre desde una subshell
shell linux ejemplos (6)
¿Cómo configuro una variable en el shell principal, desde una subshell?
a=3
(a=4)
echo $a
El punto central de una subshell es que no afecta a la sesión de llamada. En bash, una subshell es un proceso secundario, otras shells difieren, pero incluso entonces una configuración de variable en una subshell no afecta a la persona que llama. Por definición.
¿Necesita una subshell? Si solo necesitas un grupo, usa llaves:
a=3
{ a=4;}
echo $a
Da 4
(ten cuidado con los espacios en ese). Alternativamente, escriba el valor de la variable en la salida estándar y capture en la persona que llama:
a=3
a=$(a=4;echo $a)
echo $a
Evite el uso de back-ticks ``, están en desuso y pueden ser difíciles de leer.
Hay el hack de gdb-bash-variable:
gdb --batch-silent -ex "attach $$" -ex ''set bind_variable("a", "4", 0)'';
aunque eso siempre establece una variable en el alcance global, no solo el alcance principal
Para cambiar las variables en una secuencia de comandos llamada desde una secuencia de comandos principal, puede llamar a la secuencia de comandos precedida por "."
a=3
echo $a
. ./calledScript.sh
echo $a
en calledScript.sh
a=4
Rendimiento esperado
3
4
Puede generar el valor en la subshell y asignar la salida de subshell a una variable en el script del llamante:
# subshell.sh
echo Value
# caller
myvar=$(subshell.sh)
Si la subshell tiene más para generar, puede separar el valor de la variable y otros mensajes redirigiéndolos a diferentes flujos de salida:
# subshell.sh
echo "Writing value" 1>&2
echo Value
# caller
myvar=$(subshell.sh 2>/dev/null) # or to somewhere else
echo $myvar
Alternativamente, puede generar asignaciones de variables en la subshell, evaluarlas en el script del llamante y evitar el uso de archivos para intercambiar información:
# subshell.sh
echo "a=4"
# caller
# export $(subshell.sh) would be more secure, since export accepts name=value only.
eval $(subshell.sh)
echo $a
La última forma en que puedo pensar es usar códigos de salida, pero esto cubre solo el intercambio de valores enteros (y en un rango limitado) y rompe la convención para interpretar los códigos de salida (0 para éxito no 0 para todo lo demás).
Si el problema está relacionado con un bucle while, una forma de solucionarlo es mediante la Sustitución de procesos:
var=0
while read i;
do
# perform computations on $i
((var++))
done < <(find . -type f -name "*.bin" -maxdepth 1)
como se muestra aquí: https://.com/a/13727116/2547445
Usted no El subshell no tiene acceso al entorno de sus padres. (Al menos dentro de la abstracción que proporciona Bash. Podrías intentar usar gdb
, o destruir la pila, o lo que sea, para obtener dicho acceso de forma clandestina. Sin embargo, no lo recomendaría).
Una alternativa es que la subshell escriba las declaraciones de asignación en un archivo temporal para que las lea su padre:
a=3
(echo ''a=4'' > tmp)
. tmp
rm tmp
echo "$a"