No Bourne shell, o redirecionamento de um comando composto (como o while
loop) executa esse comando composto em um subshell.
No Solaris 10 e anterior 1 , você não deseja usar /bin/sh
como o shell Bourne. Use /usr/xpg4/bin/sh
ou /usr/bin/ksh
para obter um POSIX sh
.
Se por algum motivo você tiver que usar /bin/sh
, então, para contornar isso, em vez de fazer:
compound-command < file
Você pode fazer:
exec 3<&0 < file
compound-command
exec <&3 3<&-
Isto é:
- duplique o fd 0 para o fd 3 para salvá-lo e, em seguida, redirecione 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, o Oracle eventualmente (finalmente) fez /bin/sh
um shell POSIX, então ele agora se comporta como sh
da maioria dos outros Unices (ele interpreta a linguagem sh
especificada pelo POSIX embora suporte extensões sobre como ele é baseado em ksh88
(como outros Unices, onde sh
agora é geralmente baseado em ksh88, pdksh, bash, yash ou uma cinza aprimorada))