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

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

Re: [shell-script] Erro no shell script


From: Gustavo Chaves
Subject: Re: [shell-script] Erro no shell script
Date: 22 Feb 2005 16:48:36 -0300
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3

>>>>> 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.


reply via email to

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