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 [EMAIL PROTECTED]
echo PIPE0=$PIPESTATUS[0] PIPE1=$PIPESTATUS[1]
else echo "mal"
fi
echo retorno=$?
echo pipe1=$PIPESTATUS[1] pipe2=$PIPESTATUS[2]
echo [EMAIL PROTECTED]

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 <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED]
> > 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 <[EMAIL PROTECTED]<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:
> > [EMAIL PROTECTED]:~$ ./teste1.sh
> > testes que só fazem perder tempo
> > bem
> > 0[1] 0[2]
> > 0[1] 0[2]
> > [EMAIL PROTECTED]:~$
> >
> > isto assim diz que está a receber demasiados arguementos:
> > if [ `Install | tee teste1.rep` ]
> >
> > output:
> > ./teste1.sh: line 10: [: demasiados argumentos
> >
> > --- Em 
> > shell-script@yahoogrupos.com.br<shell-script%40yahoogrupos.com.br><shell-script%40yahoogrupos.com.br>,
> > "Tiago Barcellos Peczenyj"
> > <[EMAIL PROTECTED]> escreveu
> >
> > >
> > > On 10/29/07, miguelcm86 <[EMAIL PROTECTED]> 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
> > >
> > > [EMAIL PROTECTED] ~
> > > $ echo [EMAIL PROTECTED]
> > > 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]

Responder a