it-swarm.com.de

Pipe stdout to zenity notification

Ich möchte die Standardausgabe von shutdown -P +60 an zenity --notification leiten. Das geht aber nicht:

Sudo shutdown -P +60 | zenity --notification
1
user577728

Ein geeigneter Ansatz wäre, Folgendes zu tun:

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

Mit folgendem Ergebnis:

enter image description here

Es gibt mehrere wichtige Dinge:

  • da Sie ohnehin GUI-Popup verwenden werden, verwenden Sie pkexec, um GUI-Popup für Kennwort anstelle von Sudo zu verwenden.

  • Der Befehl shutdown wird an stderr stream ausgegeben (Dateideskriptor # 2). Aber Rohre nehmen nur stdout Strom auf. Daher müssen wir den Inhalt von stderr auch per Pipe umleiten. Das ist es, was 2>&1 tut. (Randnotiz: Wer dies mit bash Shell verwenden möchte, kann stattdessen |& verwenden, 2>&1 funktioniert jedoch mit den meisten Bourn-ähnlichen Shells.)

  • Mit xargs können wir Befehlszeilenargumente aus dem stdin-Stream übernehmen und einen Befehl (in diesem Fall zenity --info) mit diesen Argumenten ausführen. -L1 lässt uns eine einzelne Zeile als Argument nehmen. Somit wird die Ausgabe von shutdown in % gespeichert und in zenity --width=250 --height=250 --info --text=% ersetzt.

Der Grund, warum ich zenity --notification nicht verwende, ist auch, dass es zwei Schaltflächen hat - Abbrechen und OK, aber für den Befehl shutdown müssen Sie speziell shutdown -c ausführen, um ihn abzubrechen Abbrechen-Button im Benachrichtigungsdialog absolut unbrauchbar.

8

Sie können den anzuzeigenden Text auf diese Weise nicht in zenity --notification umleiten.

Aus 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'

Sie können also die von Ihnen übergebenen Daten entweder in das Format message: COMMAND-OUTPUT konvertieren und die Option --listen verwenden, oder die Nachricht im Befehl direkt als Argumentoption hinter --text= übergeben:

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

Der Befehl, dessen Ausgabe Sie erfassen möchten, ist in $( ) eingeschlossen, der als Bash-Befehlssubstitution bezeichnet wird. Es führt den inneren Befehl aus und verhält sich so, als ob die Ausgabe (nur Standardausgabestream) stattdessen eingegeben worden wäre.

Beachten Sie auch den 2>&1, der den Standardfehlerstrom des inneren Befehls zum Standardausgabestrom umleitet. Dies ist erforderlich, weil shutdown seine Informationsnachricht an den Standardfehlerstrom ausgibt, der nicht von der Bash-Befehlsersetzung erfasst wird.

7
Byte Commander