pipe stdout para notificação de zenity

1

Gostaria de canalizar o stdout de shutdown -P +60 para zenity --notification . Mas isso não funciona:

sudo shutdown -P +60 | zenity --notification
    
por Sergiy Kolodyazhnyy 28.01.2017 / 01:20

2 respostas

8

A abordagem adequada seria fazer o seguinte:

$ pkexec shutdown -P +60 2>&1 | xargs -L1 -I %  zenity --width=250 --height=250 --info --text=%

Com o seguinte resultado:

Existem várias coisas importantes acontecendo:

  • já que você estará usando o pop-up da GUI, use pkexec para ter o pop-up da GUI para senha em vez de sudo .

  • O comando
  • shutdown é enviado para o fluxo stderr (descritor de arquivo # 2). Mas os canais só recebem fluxo de stdout. Assim, precisamos redirecionar o conteúdo do stderr via pipe também. Isso é o que o 2>&1 faz. (Nota: os que pretendem usar isso com bash shell só podem usar |& , porém 2>&1 funciona com a maioria dos shells parecidos com Bourn)

  • xargs nos permite obter argumentos de linha de comando do fluxo de stdin e executar um comando (neste caso zenity --info ) com esses argumentos. -L1 nos permite considerar uma única linha como argumento. Assim, a saída de shutdown será armazenada na variável % e substituída em zenity --width=250 --height=250 --info --text=%

A razão pela qual eu não estou usando zenity --notification é também porque tem dois botões - cancelar e OK, mas para o comando shutdown você precisa especificamente fazer shutdown -c para cancelá-lo, fazendo com que o botão cancelar o diálogo de notificação absolutamente inútil.

    
por Sergiy Kolodyazhnyy 28.01.2017 / 01:45
7

Você não pode canalizar o texto que deseja exibir em zenity --notification dessa maneira.

De man zenity :

   Notification options

   --text=STRING
          Set the notification text

   --listen
          Listen  for  commands  on  stdin.  Commands  include  'message',
          'tooltip', 'icon', and 'visible' separated by a colon. For exam‐
          ple,  'message:  Hello  world',  'visible:  false',  or   'icon:
          /path/to/icon'.  The  icon  command  also accepts the four stock
          icon: 'error', 'info', 'question', and 'warning'

Assim, você pode de alguma forma converter os dados que canaliza para o formato message: COMMAND-OUTPUT e usar a opção --listen , ou mais simples, passar diretamente a mensagem no comando como opção de argumento por trás de --text= :

zenity --notification --text="$(shutdown -P +60 2>&1)"

O comando do qual você deseja capturar a saída é colocado em $( ) , que é chamado Bash "substituição de comando". Ele executa o comando interno e se comporta como se a saída de uma pessoa (somente fluxo de saída padrão) fosse inserida no lugar dela.

Observe também o 2>&1 que redireciona o fluxo de erro padrão do comando interno para o fluxo de saída padrão. Isso é necessário porque shutdown imprime sua mensagem de informação no fluxo de erro padrão que não é capturado pela substituição do comando Bash.

    
por Byte Commander 28.01.2017 / 01:42