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: Carlos Ferreira
Subject: Re: [shell-script] Re: Funções com comando tee
Date: Tue, 30 Oct 2007 11:05:31 -0200

Julio,
fiz o teste e deu retorno diferente:

#! /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 Valores vetPIPE=${PIPESTATUS[@]}
echo PIPE0=$PIPESTATUS[0] PIPE1=$PIPESTATUS[1]
else echo "mal"
fi
echo retorno=$?
echo pipe1=$PIPESTATUS[1] pipe2=$PIPESTATUS[2]
echo ${PIPESTATUS[@]}

exit 0

Resultado obtido:

$ ./teste_pipe.sh
testes que só fazem perder tempo
bem
Valores vetPIPE=0
PIPE0=0[0] PIPE1=0[1]
retorno=0
pipe1=0[1] pipe2=0[2]
0


-- 
Carlos Ferreira
Analista de Desenvolvimento
Niterói - RJ - Brasil
LinuxUser  #271002
http://www.carnivorosemdentes.blogger.com.br/
================

Em 30/10/07, Julio C. Neves <address@hidden> escreveu:
>
>   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<miguelcm86%40yahoo.com.br>>
> 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><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]
>
>  
>


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



reply via email to

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