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