shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Dúvida com return


From: Tiago Peczenyj
Subject: Re: [shell-script] Dúvida com return
Date: Tue, 4 Mar 2014 14:17:31 +0100

Hehe.

Bom, o julio explicou em parte.

A diferença entre

comando1 | comando2

e

comando2 < <(comando1)

é qual comando vc esta executando em um subshell. por exemplo

grep X file | tr A a

ou

tr A a < <(grep X file)

ambos são equivalentes a fazer

$ grep X file > arquivo
$ tr A a < arquivo

exceto que vc nao usa um arquivo temporario e sim um "pipe"

veja so

$ ls <( grep X file )
/dev/fd/63

o <( comando ) cria um arquivo ficticio.

quando vc faz 

comando < arquivo

o que vc faz é o "mesmo" que 

cat arquivo | comando

ou seja, vc esta jogando o conteudo do arquivo na stdin do comando.

mas pq usamos isso no while???

while read linha ; do
   echo $linha
done < arquivo

isso é um tipo de "cat" e isso

while read linha ; do
   echo $linha
done < <(comando)

basta juntar tudo o que vc aprendeu aqui.

É a melhor forma? não sei... o importante é entender que isto

while read linha ; do
   echo $linha
done

é executado no shell corrente entao um return ai dentro vai ser entendido pela funcao

enquanto isso

cat arquivo | while read linha ; do
   echo $linha
done

o while sear executado em um subshell e um return ai a funcao nem vai sentir.

tudo isso sao tecnicas de conectar dois processo com um pipe ( ou named pipe) e sincroniza-los.

Aproveite

Tiago



2014-03-04 12:46 GMT+01:00 Julio C. Neves <address@hidden>:
 

Fala Willy,
não quero me meter na conversa de vcs, mas como o Tiago é muito meu amigo, creio que ele não vai brigar comigo, nem deixar de pagar o chope. ;)

Mas vc entenderá tudinho sobre esse tema se ler este capítulo do Papo de Botequim, que tem um exemplo exatamente igual a esse, que o Tiago respondeu, veja:

    while read arq
    do
        ((i++)) # assim nao eh necessario inicializar i
        echo "$i: $arq"
    done < <(ls)
    echo "No diretorio corrente (`pwd`) existem $i arquivos"

Alias, o ideal seria ler o Papo de Botequim completo e se embebedar de conhecimento de Shell... ;)

Abcs,
Julio
@juliobash

Próximos cursos de Shell

Cidade

Local

Período

Rio de Janeiro

EDX

10-14/03

Dou treinamento de shell em qualquer cidade.
Para detalhes, entre em contato por email ou
echo 436233889341364416673541503686485725801923229706P | dc 



Em 4 de março de 2014 00:05, Willy Romão <address@hidden> escreveu:

 

Tiago,

Muito obrigado.

Era exatamente isso, pode explicar melhor o que aconteceu? E também explicar a linha "done < <(ls /home)"?

Não é um teste de diretorio, a função que eu escrevi era apenas um exemplo didático para explicar o meu problema.

Willy Romão

On 03/03/2014 08:18 PM, Tiago Peczenyj wrote:
 
Ola

o problema esta no pipe.

quando vc faz

comando | ...

o que esta depois do pipe é executado em um outro processo. logo o return "de lá" não é visto pela função "de cá".

veja se isto funciona:


while read diretorio; do

if [[ ${diretorio} = ${usuario} ]]; then
echo "Existe o diretorio do usuario"
return 0
fi

done < <(ls /home)

OU

for diretorio in /home/*; do

if [[ ${diretorio} = ${usuario} ]]; then
echo "Existe o diretorio do usuario"
return 0
fi

done

Por outro lado, se vc quer testar se o diretorio existe, vc pode fazer test -d como

if [[ -d diretorio ]]; then
  echo "existe"
fi


2014-03-04 0:05 GMT+01:00 Willy Romão <address@hidden>:
 

Senhores,

Estou com dúvida na utilização do return em certos casos, talvez vocês
poderiam me ajudar a entender:

Caso comum do uso do return:

funcao()
{
echo "Essa eh minha funcao"
return 1
echo "Esse echo nunca vai ser executado, pq o return ja vai
retornar o valor 0 para quem chamou a funcao"
}

A saída dessa função, será apenas o primeiro echo, e a variável $? vai
ter o valor 1 do retorno.

Até aí, entendido. O caso que eu estou tendo problema:

funcao()
{
usuario=$1

ls /home |
while read diretorio; do

if [[ ${diretorio} = ${usuario} ]]; then
echo "Existe o diretorio do usuario"
return 0
fi

done

echo "O diretorio desse usuario nao existe"
return 1
}

Nesse caso, quando a variavel ${diretorio} fosse igual a ${usuario},
deveria executar o comando (echo "Existe o diretorio do usuario") e
depois o return 0, saindo da funcao e retornando 0 para quem chamou. Mas
isso não acontece, o while continua e acaba chegando na mensagem de erro
e no retorno 1. Por que isso acontece?

*A função é uma analogia, o caso real é diferente.

Obrigado a todos,

Willy Romão




--
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj





--
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj

reply via email to

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