Alguém poderia me explicar por que meu loop while parece ter um escopo interno? Já vi várias explicações online, mas todas têm a ver com canos. Meu código não tem nenhum.
O 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"
A saída:
File contents: In the file
While scope:
test1: bob
Script scope:
test1:
test2: test2
Responder1
No shell Bourne, o redirecionamento de um comando composto (como o seu while
loop) executa esse comando composto em um subshell.
No Solaris 10 e versões anteriores 1 , você não deseja usar /bin/sh
porque é o shell Bourne. Use /usr/xpg4/bin/sh
ou /usr/bin/ksh
para obter um POSIX sh
.
Se por algum motivo você precisar usar /bin/sh
, para contornar isso, em vez de fazer:
compound-command < file
Você pode fazer:
exec 3<&0 < file
compound-command
exec <&3 3<&-
Aquilo é:
- duplique o fd 0 no fd 3 para salvá-lo e redirecione o fd 0 para o arquivo.
- execute o comando
- restaure o fd 0 da cópia salva no fd 3. E feche o fd 3 que não é mais necessário.
1 . No Solaris 11 e posterior, a Oracle eventualmente (finalmente) criou /bin/sh
um shell POSIX, então agora ele se comporta como a sh
maioria dos outros Unices (ele interpreta a sh
linguagem especificada pelo POSIX, embora suporte extensões sobre ele, pois é baseado em ksh88
(como outros Unices , onde sh
agora é geralmente baseado em ksh88, pdksh, bash, yash ou um ash aprimorado))