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

[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




 




reply via email to

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