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]> 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>, > "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]