[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RES: [shell-script] Erro no shell script
From: |
Rodolfo Villanova |
Subject: |
RES: [shell-script] Erro no shell script |
Date: |
Tue, 22 Feb 2005 17:11:22 -0300 |
Caro amigo Gustavo,
Um pequeno reparo à tua conjectura: no teste realizado dentro de um arquivo,
me preocupei em incluir na primeira linha a famosa:
#!/bin/ksh
Não pude testar a proposta do Julio, incluindo na primeira linha
#!/bin/bash, em razão de os servidores em que trabalho não possuirem o bash
instalado (e nem me é autorizado instalá-lo).
Abraços a todos,
--------------------------
Rodolfo D. Gross Villanova
> -----Mensagem original-----
> De: address@hidden [mailto:address@hidden]
> Enviada em: terça-feira, 22 de fevereiro de 2005 16:49
> Para: address@hidden
> Assunto: Re: [shell-script] Erro no shell script
>
>
>
> >>>>> On Tue, 22 Feb 2005 15:09:14 -0300, Julio Cezar Neves -
> DATAPREVRJ <address@hidden> said:
>
> > 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.
>
> Manter o ambiente do loop ou melhorar o desempenho geral do script
> pode até ser importante, mas o problema imediato do Rodolfo era
> descobrir a causa do erro sintático que ele estava obtendo.
>
> > 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ê!
>
> Testei na linha de comando e funcionou. Então, porque quando eu
> testei com o código original do Rodolfo ligeiramente adaptado deu o
> mesmo erro?
>
> $ cat >r.sh <<EOF
> while read user; do
> if [ -d $user -a ! -z "$(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)
> EOF
> $ sh r.sh
> r.sh: line 6: syntax error near unexpected token `<'
> r.sh: line 6: `done < <(ls home)'
> $
>
> Ah! O que me enganou foi chamar a shell de 'sh'. No Linux, sh é um
> link simbólico pra bash mas não funciona igual. Veja a parte
> relavante do manpage:
>
> If bash is invoked with the name sh, it tries to mimic the
> startup behavior of historical versions of sh as closely as
> possible, while conforming to the POSIX standard as well.
>
> Como a 'sh' original não suporta '<(...)', a bash também dá erro
> quando chamada como 'sh'. Quando eu chamo explicitamente como bash
> funciona:
>
> $ bash r.sh
> $
>
> Assim como funciona se eu chamar o arquivo diretamente:
>
> $ chmod +x r.sh
> $ ./r.sh
> $
>
> Logo, minha próxima conjectura (caro Rodolfo) é que o seu script tem
> "#!/bin/sh" na primeira linha ou que você o esteja chamando
> diretamente como "sh <script>". Experimente substituir a primeira
> linha por "#!/bin/bash" ou chamá-lo como "bash <script>" pra ver se o
> problema se resolve.
>
> 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