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: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] Re: Funções com comando tee
Date: Tue, 30 Oct 2007 11:14:35 -0200

Ah... mas veja só

echo "bem"
echo Valores vetPIPE=${PIPESTATUS[@]}

tanto a variavel $? quanto o vetor PIPESTATUS se referem ao ultimo processo
executado pelo script.

nesse seu exemplo, vc esta vendo o codigo de retorno da instrução -> echo
"bem"

O ideal é guardar esse vetor assim:

MEUVETOR=( ${PIPESTATUS[@]} )  # logo depois do comando

e ir para o abraço :)

On 10/30/07, Carlos Ferreira <address@hidden> wrote:
>
>   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>>
> 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>>
>
> > 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>,
>
> > > "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]
>
>  
>



-- 
Tiago B Peczenyj
Linux User #405772

http://peczenyj.blogspot.com/


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



reply via email to

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