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

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

Re: [shell-script] Re: Funções com comando tee


From: Julio C. Neves
Subject: Re: [shell-script] Re: Funções com comando tee
Date: Tue, 30 Oct 2007 09:37:53 -0300

Olá Miguel,
vou te explicar o que está acontecendo, mas vc terá de estudar um pouco. É
muito comum as pessoas confundirem o uso do if eo uso do cmd test. A melhor
forma de vc aprender para sempre o uso destes cmds é ler este texto sobre o
if<http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo003#Comandos_Condicionais>e
este
texto sobre o 
test<http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo004#O_Comando_test>.
Vc não perderá mais de 30 min para aprender e se quiser aproveitar e ir
convertendo para o Português Europeu, será muito bem vindo.

O par de parênteses quadrados (que no Brasil chamamos de colchetes) é o cmd
test, que serve para testar condições, porém sem dar resultado algum a não
ser o $?. Nas outras linguagens que estamos habituados, quem testa condições
é o if no shell, como vimos, é o test e o if testa se uma instrução foi bem
executada ou não.

Assim, o seu if deveria testar a execução da sua função. Para entender isso,
deixe a função como vc definiu e faça o seguinte:

$ if Install
> then
>     echo Resultado OK
> else
>     echo $?
>     echo Resultado NOK
> fi
testes que só fazem perder tempo
34
Resultado NOK

Até aí tudo funciona com o esperado, porém vejamos o que acontece se
adicionarmos um tee:

$ if Install | tee teste1.rep
> then
>     echo Resultado OK
> else
>     echo $?
>     echo Resultado NOK
> fi
testes que só fazem perder tempo
Resultado OK

Epa! Não era esse o resultado esperado! Vamos agora adicionar o vetor
(array) PIPESTATUS que o Tiago mencionou para entender o que está
acontecendo:

$ if  Install | tee teste1.rep
> then
>     echo ${PIPESTATUS[@]}
>     echo bem
> else
>     echo mal
> fi
testes que só fazem perder tempo
34 0
bem

Ahhh, agora dá para entender o que houve... Repare que o retorno do pipe foi
34 e zero, e assim sendo o zero representa cmd bem executado e por isso ele
executa os cmds do then e não os do else como esperávamos. A forma de
contornar isso seria:

$ Install | tee teste1.rep
testes que só fazem perder tempo
$ if [ ${PIPESTATUS[0]} -eq 34 ]
> then
>     echo mal
> else
>     echo bem
> fi
mal

Abraços aos amigos portugueses,
Julio


Em 29/10/07, miguelcm86 <address@hidden> escreveu:
>
>   Pensei que houvesse uma solução mais fácil.. estou a testar, mas além
> de não perceber muito bem como é que isso funciona, eu chamo todas
> pipesatus [0] e [1] e [2] e estão todos a 0.
> aqui está o codigo:
>
> #! /bin/bash
> Install(){
> echo "testes que só fazem perder tempo"
> return 34
> }
>
> if ( Install | tee teste1.rep ) ##executa as funções e guarda os output
> then echo "bem"
> echo $PIPESTATUS[0] $PIPESTATUS[1]
> else echo "mal"
> fi
> echo $PIPESTATUS[1] $PIPESTATUS[2]
>
> exit 0
>
> por mais que altere o 34 para o 0 e outro valor o output é sempre este:
> miguel@linux-rula:~$ ./teste1.sh
> testes que só fazem perder tempo
> bem
> 0[1] 0[2]
> 0[1] 0[2]
> miguel@linux-rula:~$
>
> isto assim diz que está a receber demasiados arguementos:
> if [ `Install | tee teste1.rep` ]
>
> output:
> ./teste1.sh: line 10: [: demasiados argumentos
>
> --- Em address@hidden <shell-script%40yahoogrupos.com.br>,
> "Tiago Barcellos Peczenyj"
> <tiago.peczenyj@...> escreveu
>
> >
> > On 10/29/07, miguelcm86 <miguelcm86@...> wrote:
> > >
> > > olá pessoal
> > >
> > > o que se passa é simples
> > >
> > > -Tenho que chamar uma função install, guardar todo o seu output
> dentro
> > > de um arquivo e saber qual o return que recebo da função install.
> > > Estou a fazer desta maneira que está errada, queria saber como
> resolvo.
> > >
> > > Install(){
> > > ......
> > > return variavel
> > > }
> > >
> > > if [ Install | tee install.rep ]
> > > then echo "return = 0"
> > > else echo "return = 1"
> > > fi
> > >
> > > uso o comando tee porque quero no install.rep todo o output no
> ficheiro.
> > >
> >
> > Miguel,
> >
> > a palavra "return" em uma função é semelhante ao exit de um script,
> > porém interrompe apenas a função, e o seu resultado pode ser lido pela
> > variavel $? e pode ser usado nas operações && e ||
> >
> > function xxx() {
> > return 12
> > }
> >
> > $ xxx
> >
> > $ echo $?
> > 12
> >
> > Agora, quando vc esta trabalhando com pipes, esse resultado é
> > armazenado em um vetor chamado PIPESTATUS, que guarda o retorno de
> > cada processo
> >
> > $ xxx | tee supimpa
> >
> > visitante@fred ~
> > $ echo ${PIPESTATUS[@]}
> > 12 0
> >
> > certo, mano ?
> >
> > Existem outras alternativas como usar sinais, mas por enquanto deve
> bastar ;-)
> >
> > --
> > Tiago B Peczenyj
> > Linux User #405772
> >
> > http://peczenyj.blogspot.com/
> >
>
>  
>



-- 
Abraços,
Julio
http://www.julioneves.com - Um livro sobre Bash completo e on-line
:wq


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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