2 command-line shutdown scripts zenity
我想将标准输出通过管道shutdown -P +60传输到zenity --notification. 但这不起作用:
sudo shutdown -P +60 | zenity --notification
Run Code Online (Sandbox Code Playgroud)
您不能通过管道将要显示的文本以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 命令替换未捕获该流。
正确的方法是执行以下操作:
$ 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取消它,从而使通知对话框中的取消按钮完全无用。