shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RES: RES: [shell-script] Erro no shell script


From: Julio Cezar Neves - DATAPREVRJ
Subject: RES: RES: [shell-script] Erro no shell script
Date: Tue, 22 Feb 2005 15:09:14 -0300

Quequeisso gente!

Sob o Bash:

Prompt> while read arq; do ((i++)); echo Arq$i:$arq; done < <(ls)
Arq1:a
Arq2:AA
Arq3:aaas
Arq4:arch
Arq5:arq1
Arq6:arq10
Arq7:arq2
Prompt> echo $i
7

Faça o mesmo com ls | while ... e ao fim do processo tente achar o valor de
$i. Impossível! Isso pq o pipe criou um subshell que além de onerar a
máquina, perdeu todo o ambiente criado no seu interior após o seu término.

O nome disso é substituição de procecesso e eu *asseguro* a vcs que o bash e
o ksh (a não ser que estejam capengas) suportam.

Rodolfo, testa isso aí no ksh e conta para a lista, Tchê!

[ ]s,
Julio
:wq


| -----Mensagem original-----
| De: Gustavo Chaves [mailto:address@hidden]
| Enviada em: terça-feira, 22 de fevereiro de 2005 14:50
| Para: address@hidden
| Assunto: Re: RES: [shell-script] Erro no shell script
| 
| 
| 
| >>>>> On Tue, 22 Feb 2005 13:29:32 -0300, "Renato L. Sousa" 
| <address@hidden> said:
| 
|   > Hummmm... Estou usando o bash (/bin/bash), e pelo q vi o 
| sh no linux é 
|   > um link pro bash, então deveria funcionar, não ???
| 
| Acho que sim.  Mas consegui reproduzir seu problema aqui.  Também não
| entendi... parece que a bash não entende o redirecionamento de
| processos depois de um while...done.
| 
|   >> | while read user; do
|   >> |    if [ -d $user -a $(grep -w $user /etc/passwd) ]; then
|   >> |       echo -ne "Atribuindo quota do usuário $user...\t"
|   >> |       edquota -u $dir  -p quota_model && echo "OK" || 
| echo "Falhou"
|   >> |    fi
|   >> | done < <(ls /home)
| 
| Consegui contornar o problema usando pipe ao invés do redirecionador.
| Assim:
| 
|         ls /home | while read user; do
|             ...
|         done
| 
| Mas há outro problema.  Você deve colocar aspas em torno do $(grep...)
| pois se ele não voltar nada o comando test (a.k.a. "[") vai reclamar
| da falta de um argumento.  A versão final ficaria assim:
| 
|       ls /home | while read user; do
|          if [ -d $user -a "$(grep -w $user /etc/passwd)" ]; then
|             echo -ne "Atribuindo quota do usuário $user...\t"
|             edquota -u $dir  -p quota_model && echo "OK" || 
| echo "Falhou"
|          fi
|       done
| 
| Gustavo.
| 
| 
| ---------------------------------------------------------------------
| Esta lista não admite a abordagem de outras liguagens de 
| programação, como perl, C etc. Quem insistir em não seguir 
| esta regra será moderado sem prévio aviso.
| ---------------------------------------------------------------------
| Sair da lista: address@hidden
| ---------------------------------------------------------------------
| Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
 
Links do Yahoo! Grupos




 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]