¿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 while
bucle) ejecuta ese comando compuesto en un subshell.
En Solaris 10 y versiones anteriores 1 , no desea utilizarlo /bin/sh
ya que es el shell Bourne. Utilice /usr/xpg4/bin/sh
o /usr/bin/ksh
en 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:
- duplique el fd 0 en fd 3 para guardarlo y luego redirija fd 0 al archivo.
- ejecutar el comando
- 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/sh
un shell POSIX, por lo que ahora se comporta como la sh
mayoría de los otros Unices (interpreta el sh
lenguaje especificado por POSIX aunque admite extensiones sobre él ya que se basa en ksh88
(como otros Unices , donde sh
ahora generalmente se basa en ksh88, pdksh, bash, yash o un ash mejorado))