передайте stdout по каналу к zenity уведомлению

Я хотел бы передать stdout по каналу shutdown -P +60 кому: zenity --notification. Но это не работает:

sudo shutdown -P +60 | zenity --notification
1
задан 28 January 2017 в 06:08

2 ответа

Вы не можете передать по каналу текст, который Вы хотите отобразить в 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.

7
ответ дан 3 December 2019 в 06:18

Надлежащий подход должен был бы сделать следующее:

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

Со следующим результатом:

enter image description here

Существует несколько важных вещей, продолжающихся:

  • так как Вы собираетесь быть использованием всплывающее окно 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 отменять его, таким образом делая кнопку отмены в диалоговом окне уведомления абсолютно бесполезной.

8
ответ дан 3 December 2019 в 06:18

Другие вопросы по тегам:

Похожие вопросы: