Escape texto para passar ainda mais para o zenity

1

Vou mostrar uma janela de erro usando zenity :

/usr/bin/zenity --error --text="my error message"

O texto do erro a ser transmitido é obtido como saída de outro aplicativo. Esta saída pode conter aspas, barras invertidas e outros símbolos especiais que podem impedir que zenity seja iniciado corretamente.

/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

Qual é a maneira mais fácil de normalizar essa saída antes de passar para zenity ? /bin/tr suponho? Mas eu gostaria de mostrar a mensagem original não modificada.

    
por zweibaranov 30.04.2012 / 21:52

1 resposta

1

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/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/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.

    
por 01.05.2012 / 02:52