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

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

Re: [shell-script] Re: Valor da variável do subshell para o shell


From: Tiago Peczenyj
Subject: Re: [shell-script] Re: Valor da variável do subshell para o shell
Date: Wed, 24 May 2017 18:31:39 +0200

Ola

Vamos por partes: vc esta executando um comando em background (&) e quer o codigo de retorno dele?

vc vai ter q sincronizar isso ai via WAIT , pois o case $retorno vai acontecer em paralelo.

o que eu faria?

( comando ; echo $? > /tmp/retorno ) &

mostra mensagem de aguarde

wait %1  # isso aqui vai esperar pelo primeiro job em background.

retorno="$( cat /tmp/retorno )"

case $retorno ...

vc pode substituir o /tmp/retorno por outra coisa ( como um arquivo unico cujo nome contem o PID do processo corrente, etc ) 

2017-05-24 18:10 GMT+02:00 Tiago Tarifa address@hidden [shell-script] <address@hidden>:
 

Ola pessoal!

Infelizmente ainda não deu certo.

Conforme prometido, o ambiente é este:

Desenvolvi um script chamado 'atualizador.sh' que fará atualizações de pacotes RPMs através de um pendrive. Até ai tudo bem.
O atualizador retorna 5 códigos de erro e 0 para sucesso. Em casos de erros ele alimenta um arquivo de log.

Como estou lidando com usuários finais (e bota finais nisso) eu fiz um menu em zenity que uma das opções é "Atualizar", que chama o atualizador.sh em segundo plano. Para que o usuário "saiba" o que está acontecendo, eu queria deixar uma barra de progresso com o zenity usando a opção --pulsate com a --progress.

Então fiz desta forma com a alteração proposta pelo Itamar. O problema está envolto nos cometários '#---zica' que fiz:

AtualizarProdutos() {
   local arquivoLog="$LogFile"
   local retorno

   if GuiPerguntar "Deseja continuar com a atualização?"
   then
      #---zica começa aqui
      retorno="$(sudo /opt/dj/bin/atualizador.sh "$arquivoLog" ; echo $?)" &
      GuiBarraProgresso "Atualização em andamento. Por favor, aguarde..."
      #---zica termina aqui
      case $retorno in   
          0) GuiInfo "Sucesso!\nRemova o pendrive e reinicie o computador!"
             ;;
          1) GuiErro "Pendrive não encontrado!"
             ;;
          2) GuiErro "Pendrive não esta formatado!"
             ;;
          3) GuiErro "Erro ao tentar acessar a partição do pendrive!"
             ;;
          4) GuiErro "Nenhum arquivo de atualização encontrado!"
             ;;
          5) GuiErro "Ocorreu uma falha durante a atualização!"
             ;;
      esac
   fi
}

O código do GuiBarraProgresso é este:
GuiBarraProgresso() { #USO: comando & GuiBarraProgresso "Texto"
   local titulo="$Titulo"
   local texto="$1"
   local yeslabel="Avançar"
   local pid=$!
 
   if [ -n "$Zenity" ]
   then
       while kill -0 $pid 2>/dev/null
       do
         sleep .5
         done                             \
            | zenity                      \
              --title="$titulo"           \
              --text="$texto"             \
              --progress                  \
              --pulsate                   \
              --auto-close                \
              --ok-label="$yeslabel"      \
              --no-cancel
  fi     
}

Não coloquei os fontes do GuiErro e GuiPerguntar porque achei desnecessários. Mas são zenity --error e zenity --question respectivamente.



Em 24 de maio de 2017 09:26, Tiago Peczenyj address@hidden [shell-script] <address@hidden.br> escreveu:
 

2017-05-24 14:05 GMT+02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden.br>:
 

Fala grande Tiago (por onde vc anda, rapaz? Voltou?)

Eu sempre estive aqui, a questão é o tempo que posso destinar a responder as coisas com qualidade.

 
Agora eu é que vou te complementar:

Não acho que return N seja um mal nome, uma vez que ele encerra uma função voltando (=return) para o main devolvendo (=returning) N.


Boa analogia. em C o main "retorna" para o SO o valor que foi passado. olhando em um contexto mais amplo e observado o contexto das coisas ( C, Unix e Shell foram desenvolvidos mais ou menos na mesma época )
 
É graças ao cmd return N que, assim com o exit N, joga N na variável $? que te permite saber se a função (e não o prg, pois neste caso seria o exit N) foi bem sucedido ou não.O

alias, varios programas fazem uso do exit com codigo de erro e isso pode ser concatenado com || && ou em condicionais ( if )

por exemplo o grep tem a opção -q ( quiet ) então fica facil fazer scripts assim

if grep -q palavra arquivo.txt ; then
   echo "arquivo contem a palavra"
else
   echo "arquivo NAO contem a palavra"
fi   

ou 

grep -q palavra arquivo.txt && echo "encontrou" || echo "ops..."

outro muito util é o curl (para quem precisa trabalhar com requests http) com a opção -f ( fail )

$ curl -sf www.google.com  > /dev/null && echo "ok" || echo "nok"
ok

$ curl -sf www.nao.existe.com  > /dev/null && echo "ok" || echo "nok"
nok




 
Ou seja, o return N tem as mesmas funções e sintaxe do exit N, só que, como diria o Malluf, estupra mas não mata... ;)

Já disse mas vou repetir pq antes eu dava 4 treinamentos/ano na 4 Linux e agora são só 2 por ano. Se vc estiver querendo fazer um curso de shell de 40 horas, sendo eu o instrutor. No próximo dia 29 (daqui a 5 dias) começará uma turma na 4Linux (SP). Depois deste, só terá outro em Dezembro (se meu fígado resistir até lá ;).

Além de aprender todos os pulos do gato (quem já fez meu curso sabe que ele é um intensivão de pulo do gato), vai dar um mergulho muito fundo em expressões regulares e vou apresentar rapidamente o YAD, que é o sucessor do zenity, porém infinitas vezes mais completo/complexo que ele.

Não me pergunte valores que não sei. Sou contratado pela 4Linux somente para dar o treinamento, mas é a empresa de treinamento em SL mais séria e organizada com a qual já trabalhei (por isso sobrevive há mais de 20 anos).

Abcs,
Julio

Damos treinamento em sua empresa por 
um preço, 
no mínimo, 50% mais barato que qualquer curso,
com certificado e nota fiscal.

​​
Nosso time de instrutores in company é formado somente por
autores
​ ​
de Best Sellers
​ ​
​laureados ​sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico


Em 24 de maio de 2017 08:34, Tiago Peczenyj address@hidden [shell-script] <address@hidden.br> escreveu:
 

Ola

Permita-me completar a resposta do Julio ( como se fosse possivel... )

o return dentro de funções do bash não funciona como o return de outras linguagens de programação - alias eu acho um pessimo nome nesse contexto, confunde as coisas.

o return vai emular o comando exit, por isso os valores que podem ser retornados são limitados. isso esta mais ligado a tratamento de erros, por exemplos.




2017-05-24 0:51 GMT+02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden.br>:
 

Hola Pere,
os brasileiros não precisam do Google translate traduzir espanhol. Aqui
todos entendem bem o seu idioma.

Tanto o return como o exit, só recebem números entre 0 e 255, mas veja essa
função:

function teste
{
{
echo Esta línea va a la pantalla
echo y esta también
} > /dev/tty
echo Pero esta vuelta a la variable retorno
}; export -f teste

retorno=$(teste)
echo $retorno

Abcs,
Julio

*​Damos treinamento em sua empresa por *
*um preço, no mínimo, 50% mais barato que qualquer curso,*
*com certificado e nota fiscal.*

​​
Nosso time de instrutores *in company* é formado somente por


autores
​ ​

de
*Best Sellers​ ​*​laureados ​sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico

2017-05-23 18:44 GMT-03:00 'T.Collons' address@hidden [shell-script] <
address@hidden.br>:

>
>
> Hola a todos, como Julio me ha dicho varias veces, habla en castellano no
> en goole-translate.
>
>
> Yo tambien tengo esa duda, en bash se como hacer para que una funcion
> retorne un numero, "return 99999", por ejemplo, pero si lo que queremos
> obtener es una variable o un texto, alguien sabe como hacerlo?.
>
> un ejemplo tonto
>
>
> *function ejemplo*
>
> *{*
>
> *local mirecepcion="$?"*
>
> *[ $mirecepcion == "soy tonto" ] && devolver="es verdad" || devolver="No
> es verdad"*
>
> *return devolver*
>
> *}*
>
>
>
> *devolver="Que soy?" *
>
> *ejemplo "soy tonto"*
>
> *echo $devolver*
>
>
>
> *ejemplo "no soy tonto" *
>
> *echo $devolve*r
>
> como veis quiero obtener el resultado de la variable devolver.
>
> Ya se que si la variable es global siempre tendra el resultado de ella,
> pero si os fijais en la funcion la declaro como local, no se si me explico
> bien?
>
>
> Saludos a todos
>
>
>
> El 23/05/17 a les 21:46, address@hidden [shell-script] ha escrit:
>
>
>
> Caro Tiago
>
> Nesse exemplo estou imaginando que só precise do código de retorno, e não
> da saída do ls
>
> O que imagino é que poderia fazer dessa maneira:
>
> $ retorno=$(ls /etc >/dev/null; echo $?); echo $retorno
>
>
> ou usando um arquivo temporário como:
>
> $ (ls /etc >/dev/null; echo $? > /tmp/arq_tmp); cat /tmp/arq_tmp
>
> Isso é o que deseja? Atende sua expectativa?
>
> []'s
> Itamar
>
>
> --
>
>
>
> Pere
>
> address@hidden
>
>
>
> <http://www.imatge.com/>
>
> ------------------------------------
>
> AVIS LEGAL
>
> Nota de confidencialitat: Aquest missatge podria contenir missatges
> d'empresa i altre informació confidencial tutelada per les lleis de Europea
> i altres estats, Si Vostè el rep per error o sense ser una de les persones
> esmenades a la capçalera, haurà de destruir-lo sense copiar-lo ni
> revelar-l'ho o qualsevol altre acció relacionada amb el contingut del
> missatge i notificar-ho per correu electrònic a l'emissor del missatge.
>
> Les persones o entitats que incompleixin els deures de confidencialitat
> podran ésser perseguides davant dels Tribunals de Justícia sota l'empar de
> la legislació civil, penal i administrativa nacional i internacional.
>
> Gracies per la seva cooperació.
>
> ------------------------------------
>
> LEGAL NOTICE
>
> Confidentiality notice: This mail may include business and other
> confidential information protected under the laws of and other territories.
> if you are not one of the intended recipients of the message, you are
> legally obliged to delete the message content. Furthermore, you are kindly
> requested to report immediately the incident to the sender.
>
> Breach of confidentiality duties is a serious criminal offence in and
> other territories. Offenders shall be legally prosecuted worldwide.
>
> Thank you for your cooperation.
>
>
>
>
>

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




--
Tiago B. Peczenyj

http://about.me/peczenyj





--
Tiago B. Peczenyj

http://about.me/peczenyj





--
Tiago B. Peczenyj

http://about.me/peczenyj

reply via email to

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