我想将 的标准输出通过管道传输shutdown -P +60
到zenity --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 弹出窗口,所以使用
pkexec
GUI 弹出窗口输入密码,而不是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
才能取消它,从而使通知对话框中的取消按钮完全没用。