web-dev-qa-db-fra.com

pipe stdout to zenity notification

Je voudrais raccorder la sortie standard de shutdown -P +60 à zenity --notification. Mais ça ne marche pas:

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

Une approche appropriée consisterait à:

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

Avec le résultat suivant:

enter image description here

Il y a plusieurs choses importantes qui se passent:

  • comme vous utiliserez quand même l'interface graphique, utilisez pkexec pour obtenir une interface graphique pour le mot de passe au lieu de Sudo.

  • La commande shutdown renvoie le flux stderr (descripteur de fichier n ° 2). Mais les pipes ne prennent que le flux stdout. Ainsi, nous devons également rediriger le contenu de stderr via pipe. C'est ce que 2>&1 fait. (Note latérale: ceux qui ont l'intention d'utiliser ceci avec bash Shell ne peuvent utiliser que |& à la place, cependant 2>&1 fonctionne avec la majorité des coques de type Bourn)

  • xargs nous permet de prendre des arguments de ligne de commande dans le flux stdin et d'exécuter une commande (dans ce cas zenity --info) avec ces arguments. -L1 nous permet de prendre une seule ligne comme argument. Ainsi, la sortie de shutdown sera stockée dans la variable % et remplacée par zenity --width=250 --height=250 --info --text=%

La raison pour laquelle je n'utilise pas zenity --notification est aussi parce qu'il a deux boutons - annuler et OK, mais pour la commande shutdown, vous devez spécifiquement utiliser shutdown -c pour l'annuler, ce qui rend la bouton annuler dans la boîte de dialogue de notification absolument inutile.

8
Sergiy Kolodyazhnyy

Vous ne pouvez pas diriger le texte que vous souhaitez afficher dans zenity --notification de cette façon.

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'

Ainsi, vous pouvez convertir les données que vous transmettez au format message: COMMAND-OUTPUT et utiliser l'option --listen, ou plus simplement, passer directement le message dans la commande comme option d'argument derrière --text=:

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

La commande dont vous voulez capturer la sortie est incluse dans $( ), appelée Bash "substitution de commande". Il exécute la commande interne et se comporte comme si sa sortie (flux de sortie standard uniquement) aurait été entrée à sa place.

Notez également le 2>&1 qui redirige le flux d'erreur standard de la commande interne vers le flux de sortie standard. Cela est nécessaire car shutdown imprime son message d'information dans le flux d'erreur standard qui n'est pas capturé par la substitution de commande Bash.

7
Byte Commander