Como passar dados fora do processo para o progresso do zenity?

2

Geralmente, isso seria uma questão sobre como passar dados de um subprocesso para um processo principal, mas talvez zenity tenha algumas peculiaridades adicionais, portanto, concentre-se em zenity .

Exemplo:

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

# ... here main process continues (x)

Cada passo na prática pode falhar (há mais do que apenas um eco-tar, computação md5, compactação, descompactação, nome), e eu gostaria de definir, por exemplo, ERR variável para alguma mensagem e sair o subprocesso de progresso, e depois disso exibir o conteúdo do ERR e sair para sempre.

O problema é que ERR é variável local, então eu posso quebrar o subprocesso, mas mesmo assim não consigo passar ERR para fora. Eu também não posso exibi-lo localmente, porque o script principal continuará assim mesmo, sem saber que o subprocesso falhou.

Então a questão é: como posso passar um código de erro, uma mensagem, qualquer coisa para o processo principal (continuando no ponto (x))?

Substituição de processos:

#!/bin/sh
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0 < <(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
...

Isso não funcionou para mim também, ou seja, o ERR não estava visível no script principal.

    
por greenoldman 16.05.2012 / 21:33

2 respostas

4

O que você provavelmente quer é o PIPESTATUS (do man bash:)

An array variable (see Arrays below) containing a list of exit status 
values from the processes in the most-recently-executed foreground pipeline 
(which may contain only a single command).
    
por 16.05.2012 / 22:00
3

Eu resolvi o problema como Fabian sugeriu (obrigado novamente). No entanto, não fiquei satisfeito com toda a construção do fluxo de dados. Afinal, é o Zenity que deve monitorar o progresso do trabalho; Eu não deveria ter que dobrar todo o meu programa apenas para torná-lo feliz.

Então, mudei todo o fluxo de trabalho. Primeiro eu crio um pipe nomeado para comunicar o progresso ao Zenity e, em seguida, Zenity funciona como deveria (como monitor). Então eu chamo:

(tail -f my_named_pipe) | zenity .... &

e quando eu quero definir um rótulo ou progresso eu simplesmente chamo

echo "# We are cruising..." > my_named_pipe

Se eu terminar o progresso, envio "100" para o Zenity. Isso permite que meu script principal funcione de maneira linear, sem se preocupar em passar dados de um subprocesso, porque não há subprocesso agora.

    
por 17.05.2012 / 12:42