管道标准输出到 zenity 通知

2 command-line shutdown scripts zenity

我想将标准输出通过管道shutdown -P +60传输到zenity --notification. 但这不起作用:

sudo shutdown -P +60 | zenity --notification
Run Code Online (Sandbox Code Playgroud)

Byt*_*der 9

您不能通过管道将要显示的文本以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'
Run Code Online (Sandbox Code Playgroud)

因此,您可以以某种方式将您通过管道传输的数据转换为格式message: COMMAND-OUTPUT并使用该--listen选项,或者更简单,直接将命令中的消息作为参数选项传递给后面--text=

zenity --notification --text="$(shutdown -P +60 2>&1)"
Run Code Online (Sandbox Code Playgroud)

要捕获其输出的命令包含在 中$( ),这称为 Bash“命令替换”。它运行内部命令并表现得好像该输出(仅限标准输出流)将被输入来代替它。

还要注意将2>&1内部命令的标准错误流重定向到标准输出流的 。这是必需的,因为将shutdown其信息消息打印到标准错误流,而 Bash 命令替换未捕获该流。


Ser*_*nyy 9

正确的方法是执行以下操作:

$ pkexec shutdown -P +60 2>&1 | xargs -L1 -I %  zenity --width=250 --height=250 --info --text=%
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

有几件重要的事情正在发生:

  • 由于无论如何您都将使用 GUI 弹出窗口,因此请使用pkexecGUI 弹出窗口代替密码sudo

  • shutdown命令输出到 stderr 流(文件描述符 #2)。但是管道只接受标准输出流。因此,我们还需要通过管道重定向 stderr 的内容。这就是2>&1它的作用。(旁注:那些打算bash只在shell 中使用它的人可以使用它|&,但是2>&1可以与大多数类似 Bourn 的 shell 一起使用)

  • xargs让我们从 stdin 流中获取命令行参数,并zenity --info使用这些参数运行命令(在本例中)。-L1让我们以单行作为参数。因此, 的输出shutdown将存储到%变量中并代入zenity --width=250 --height=250 --info --text=%

我不使用的原因zenity --notification也是因为它有两个按钮 - 取消和确定,但对于shutdown命令,您特别需要shutdown -c取消它,从而使通知对话框中的取消按钮完全无用。