Escopo variável no loop while-read no Solaris

Escopo variável no loop while-read no Solaris

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 whileloop) executa esse comando composto em um subshell.

No Solaris 10 e versões anteriores 1 , você não deseja usar /bin/shporque é o shell Bourne. Use /usr/xpg4/bin/shou /usr/bin/kshpara 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 é:

  1. duplique o fd 0 no fd 3 para salvá-lo e redirecione o fd 0 para o arquivo.
  2. execute o comando
  3. 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/shum shell POSIX, então agora ele se comporta como a shmaioria dos outros Unices (ele interpreta a shlinguagem especificada pelo POSIX, embora suporte extensões sobre ele, pois é baseado em ksh88(como outros Unices , onde shagora é geralmente baseado em ksh88, pdksh, bash, yash ou um ash aprimorado))

informação relacionada