Wagner Klein da Silva, @ 12:47:
> On Tue, 10 Apr 2001, Eliphas Levy Theodoro wrote:
[...]
> > não preciso guardar o IFS anterior e depois restaurar porque o próprio
> > while tem o defeito (feature?) de não compartilhar as variáveis usadas por
> > ele depois que ele se vai.
> Não é defeito, é que o "|while" é considerado um novo processo, e
> portanto ele tira uma cópia das variáveis de ambiente, e o |while
> recebe essa cópia, com tudo o que o "processo" anterior tinha, mas não
> "devolve" nada, pois um processo não é capaz de mudar as variáveis de
> ambiente do "pai".
[...]
> Eu considero esse comportamente "estranho", já fiz vários scripts
> esperando que um |while criasse e alterasse as variáveis, mas
> infelizmente compreendo que é realmente necessário manter a
> consistência de comportamento entre um pipe para uma task normal e um
> pipe para um shell script "in-line".
uma outra maneira, que surgiu numa conversa aqui no trabalho:
redirecionamento. problema: não dá pra usar texto direto, só arquivos:
-->
i=1
while read linha; do
i=$((i+1))
done < /etc/passwd
echo $i
<--
esse funciona do jeito esperado.
> > a outra maneira seria guardar o IFS em uma variável antes do while,
> > mudar ela para vírgula, e usar o próprio while para pegar os dois
> > parâmetros. depois restaurando o IFS após o done. mas essa fica de
> > lição de casa. ':)
> Era o que eu recomendaria, mas eu tinha dúvidas com relação ao IFS.
> Seu comentário me motivou a rever esse ponto obscuro (para mim) sobre
> essa variável.
>
> O que eu não sabia é que se o shell for iniciado ele redefine a
> variável IFS para o default: espaco, TAB e newline.
>
> O que vai acontecer dentro do |while é que os programas executados vão
> receber "IFS=," mas se o programa for um shell script, então IFS será
> redefinido.
Sim, havia desconsiderado esse side-effect por sempre trabalhar só com
scripts... Para garantir o funcionamento esperado, deve-se voltar o IFS ao
padrão.
> Compilando e executando o programa C abaixo, com:
>
> gcc -o x x.c
> IFS=,;./x "$IFS"
>
> percebe-se que o programa "./x" recebe a variável de ambiente IFS
> alterada mas o system(), ao reiniciar um novo "sh", redefine esta
> variável para o default.
>
> Resta testar se com um "exec*" a variável é ou não redefinida. É
> provável que não (a menos que seja um shell script ... :)
> Interessante rever esse comportamento da IFS. Não a usava pois temia
> que problemas se propagassem de forma não controlada...
Realmente. Eu uso o IFS raramente, nas ocasiões em que o código fica menos
complicado e entendível. Só pelo fato de ter de voltar o IFS, isso é
bem raro mesmo ':)
Ah, um amigo passou uma outra maneira de resolver o problema também, sem
usar IFS e até mais simples:
-->
arq=ARQUIVO
cat $arq | while read linha; do
script_em_perl "${linha#*,}"
script_em_bash "${linha%,*}"
done
<--
usa o corte de strings do bash. droga, com tantas opções, o difícil não é
fazer o script, é decidir qual delas usar ':)
sed you later,
--
./eliphas.sh -levy | vim -x -R -b -T screen -c 'screen -r' -
"From a programmer's point of view, the user is a peripheral
that types when you issue a READ request." -Peter Williams
============ ALL YOUR BASE ARE BELONG TO US! ============
Assinantes em 11/04/2001: 2204
Mensagens recebidas desde 07/01/1999: 108767
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
mailto:[EMAIL PROTECTED]