[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RES: [shell-script] Erro no shell script
From: |
Julio Cezar Neves - DATAPREVRJ |
Subject: |
RES: [shell-script] Erro no shell script |
Date: |
Tue, 22 Feb 2005 17:04:53 -0300 |
Gustavo,
isso é muito confuso. Ainda não consegui entender legal o comportamento da
substituição de processos dentro do ksh. Veja algumas diferenças:
Prompt> echo $SHELL
/bin/ksh
Prompt> ls -l >(cat)
[1] 11439
crw-rw-rw- 1 root root 130, 4 Feb 22 16:53 /dev/fd/4
Repare que *foi gerado um programa em background* (???????) e a execução
deu-se em um device orientado a caracter. Veja agora a mesma coisa no Bash
(este eu entendo pq li o código):
Prompt> echo $SHELL
/bin/bash
Prompt> ls -l >(cat)
l-wx------ 1 jneves jneves 64 Feb 22 16:40 /dev/fd/63 ->
pipe:[256829]
Ahhh, agora sim! Foi criado um device que é um link simbólico para um
arquivo de named pipe temporário.
[ ]s,
Julio
Esta é a semana
Julio Neves nas Dicas-L
http://www.dicas-l.unicamp.br/dicas-l/
IMPERDÍVEL!!!
| -----Mensagem original-----
| De: Gustavo Chaves [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