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 12:06:03 -0200

Valeu Julio e Thiago.
Acho que desta forma fica evidente o erro que eu estava cometendo:

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

exit 0

Resultado Obtido:

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


[]s
-- 
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:
>
>   Fala Carlos,
> o resultado deu diferente pq vc fez o mesmo que o Miguel. Se vc reproduzir
> o
> que eu fiz, vc terá os resultados corretos.
>
> Acho melhor vc tb dar uma estudada nos links que passei para o Miguel, pq
> notei que vc tb não conhece bem o uso dos cmd condicionais em Shell.
>
> Abração,
> Julio
>
> Em 30/10/07, Carlos Ferreira <address@hidden<chlferreira%40gmail.com>>
> escreveu:
>
> >
> > 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 
> > <08years%40gmail.com><08years%40gmail.com>>
> > 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>
> <miguelcm86%40yahoo.com.br>
> > <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>
> > <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]
> >
> >
> >
>
> --
> 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]