转义文本以进一步传递到 zenity

转义文本以进一步传递到 zenity

我将使用以下命令显示错误窗口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/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g')"

严格来说,这并不能完美地再现应用程序的输出:如果其输出末尾有多个换行符,它们将被删除。剥离是由 shell 的命令替换构造执行的,因此为了避免这种情况,您需要确保替换命令的输出不以换行符结尾。
    output="$(/usr/bin/some-application | sed 's/\\/\\\\/g'; echo a)"
    /usr/bin/zenity --error --text="${output%a}"
不过,差异在对话框中不会很明显。

相关内容