Je voudrais raccorder la sortie standard de shutdown -P +60
à zenity --notification
. Mais ça ne marche pas:
Sudo shutdown -P +60 | zenity --notification
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:
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.
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.