Я хотел бы передать stdout по каналу shutdown -P +60
кому: zenity --notification
. Но это не работает:
sudo shutdown -P +60 | zenity --notification
Вы не можете передать по каналу текст, который Вы хотите отобразить в zenity --notification
этот путь.
От 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'
, Таким образом, Вы могли или так или иначе преобразовать данные, которые Вы передаете по каналу в формат message: COMMAND-OUTPUT
и используете --listen
опция, или более простой, непосредственно передаете сообщение в команде как опция аргумента позади --text=
:
zenity --notification --text="$(shutdown -P +60 2>&1)"
, команду которого Вы хотите получить вывод, включается в $( )
, который называют Bash "заменой команды". Это выполняет внутреннюю команду и ведет себя, как будто тот вывод (только поток стандартного вывода) был бы введен вместо него.
Также отмечают 2>&1
, который перенаправляет поток стандартной погрешности внутренней команды к потоку стандартного вывода. Это необходимо, потому что shutdown
печать его информационное сообщение к потоку стандартной погрешности, который не получен заменой команды Bash.
Надлежащий подход должен был бы сделать следующее:
$ pkexec shutdown -P +60 2>&1 | xargs -L1 -I % zenity --width=250 --height=250 --info --text=%
Со следующим результатом:
Существует несколько важных вещей, продолжающихся:
так как Вы собираетесь быть использованием всплывающее окно GUI так или иначе, использовать pkexec
чтобы иметь GUI раскрываются для пароля вместо sudo
.
shutdown
выводы команды к stderr потоку (дескриптор файла № 2). Но каналы только берут stdout поток. Таким образом мы должны перенаправить содержание stderr через канал также. Это что 2>&1
делает. (Примечание стороны: те, кто намеревается использовать это с bash
оболочка только может использовать |&
вместо этого, однако 2>&1
работы с большинством подобных Ручью оболочек)
xargs
позволяет нам взять параметры командной строки от stdin потока и выполнить команду (в этом случае zenity --info
) с теми аргументами. -L1
позволяет нам взять одну строку в качестве аргумента. Таким образом вывод shutdown
будет сохранен в %
переменная и замененный в zenity --width=250 --height=250 --info --text=%
Причина, почему я не использую zenity --notification
также, потому что это имеет две кнопки - отмена и хорошо, все же для shutdown
управляйте, чтобы Вы конкретно сделали shutdown -c
отменять его, таким образом делая кнопку отмены в диалоговом окне уведомления абсолютно бесполезной.