我将使用以下命令显示错误窗口zenity
:
/usr/bin/zenity --error --text="my error message"
要传递的错误文本是作为另一个应用程序的输出获取的。此输出可能包含引号、反斜杠和其他可能阻止zenity
正确启动的特殊符号。
/usr/bin/zenity --error --text=$(/usr/bin/some-application)
### e.g. output of /usr/bin/some/application is: failed to "' \perform
### so here will be an error
在传递到 之前标准化此类输出的最简单方法是什么zenity
?/bin/tr
我想?但我想显示未修改的原始消息。
答案1
我在文档中找不到这一点,但 Zenity 似乎对传递给 的字符串进行反斜杠扩展--text
,然后将其解释为Pango 文本属性标记,一种类似 HTML 的格式。 (谢谢工作的人指出这一点。)
首先,您需要在命令替换两边加上双引号,以避免 shell 执行扩展。这在 shell 编程中很常见:总是在变量替换和命令替换(即"$foo"
和"$(foo)"
)周围加上双引号,除非您知道为什么可以而且必须将它们去掉。
其次,您需要将来自应用程序的所有反斜杠加倍,并替换字符 。您可以使用 来执行此操作sed
。
/usr/bin/zenity --error --text \
"$(/usr/bin/some-application |
sed -e 's/\\/\\\\/g' -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')"
严格来说,这并不能完美地再现应用程序的输出:如果其输出末尾有多个换行符,它们将被删除。剥离是由 shell 的命令替换构造执行的,因此为了避免这种情况,您需要确保替换命令的输出不以换行符结尾。
output="$(/usr/bin/some-application | sed 's/\\/\\\\/g'; echo a)"
/usr/bin/zenity --error --text="${output%a}"
不过,差异在对话框中不会很明显。