将 stdout 传输到 zenity 通知

将 stdout 传输到 zenity 通知

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

sudo shutdown -P +60 | zenity --notification

答案1

您无法通过这种方式将想要显示的文本输入到管道中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 命令替换无法捕获该错误流。

答案2

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

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

结果如下:

在此处输入图片描述

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

  • 因为无论如何您都要使用 GUI 弹出窗口,所以使用pkexecGUI 弹出窗口输入密码,而不是sudo

  • shutdown命令输出到 stderr 流(文件描述符 #2)。但管道只接受 stdout 流。因此,我们也需要通过管道重定向 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才能取消它,从而使通知对话框中的取消按钮完全没用。

相关内容