Não consigo encontrar isso na documentação, mas o Zenity parece fazer uma expansão de barra invertida na string passada para --text
, que é então interpretada como Marcação de Atributos de Texto do Pango , um formato semelhante a HTML. (Graças ao manatwork para apontar isso.)
Primeiro, você precisa colocar aspas duplas em torno da substituição do comando, para evitar expansões executadas pelo shell. Isso é geral em programação shell: sempre coloque aspas duplas em torno de substituições de variáveis e substituições de comandos (ou seja, "$foo"
e "$(foo)"
), a menos que você saiba por que pode e deve deixá-las desligadas.
Em segundo lugar, você precisa dobrar todas as barras invertidas vindas do aplicativo e substituir os caracteres. Você pode fazer isso com sed
.
/usr/bin/zenity --error --text \
"$(/usr/bin/some-application |
sed -e 's/\/\\/g' -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')"
Estritamente falando, isso não reproduz a saída do aplicativo perfeitamente: se houver várias novas linhas no final de sua saída, elas serão removidas. A remoção é executada pela construção de substituição de comandos do shell, portanto, para evitar isso, é necessário garantir que a saída do comando substituído não termine em uma nova linha.
output="$(/usr/bin/some-application | sed 's/\/\\/g'; echo a)"
/usr/bin/zenity --error --text="${output%a}"
A diferença não será muito visível na caixa de diálogo.