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]