Alcance variable en bucle while-read en Solaris

Alcance variable en bucle while-read en Solaris

¿Podría alguien explicarme por qué mi bucle while parece tener un alcance interno? He visto varias explicaciones en línea, pero todas tienen que ver con tuberías. Mi código no tiene ninguno.

El código:

#!/bin/sh
while read line
do
  echo "File contents: $line"
  echo
  if [ 1=1 ]; then
    test1=bob
  fi
  echo "While scope:"
  echo "  test1: $test1"
done < test.txt

if [ 1=1 ]; then
  test2=test2;
fi

echo;
echo "Script scope: "
echo "  test1: $test1"
echo "  test2: $test2"

La salida:

File contents: In the file

While scope:
  test1: bob

Script scope:
  test1: 
  test2: test2

Respuesta1

En el shell Bourne, redirigir un comando compuesto (como su whilebucle) ejecuta ese comando compuesto en un subshell.

En Solaris 10 y versiones anteriores 1 , no desea utilizarlo /bin/shya que es el shell Bourne. Utilice /usr/xpg4/bin/sho /usr/bin/kshen su lugar para obtener un POSIX sh.

Si por alguna razón tiene que usar /bin/sh, entonces para solucionarlo, en lugar de hacer:

compound-command < file

Tu puedes hacer:

exec 3<&0 < file
compound-command
exec <&3 3<&-

Eso es:

  1. duplique el fd 0 en fd 3 para guardarlo y luego redirija fd 0 al archivo.
  2. ejecutar el comando
  3. restaure fd 0 desde la copia guardada en fd 3. Y cierre fd 3 que ya no es necesario.

1 . En Solaris 11 y posteriores, Oracle finalmente (por fin) creó /bin/shun shell POSIX, por lo que ahora se comporta como la shmayoría de los otros Unices (interpreta el shlenguaje especificado por POSIX aunque admite extensiones sobre él ya que se basa en ksh88(como otros Unices , donde shahora generalmente se basa en ksh88, pdksh, bash, yash o un ash mejorado))

información relacionada