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に似た形式です。 (ありがとうございます。従業員これを指摘してください。 )

まず、シェルが拡張を実行するのを防ぐために、コマンドの置き換えの周りに二重引用符を入れる必要があります。これはシェルプログラミングでは一般的です。削除して削除する必要がある理由がわからない限り、変数置換とコマンド置換(つまり、および"$foo")の周りに常に二重引用符を入れてください。"$(foo)"

第二に、アプリケーションから出てくるすべてのバックスラッシュを2倍にして文字を変更する必要があります。を使用してこれを行うことができます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')"

厳密に言えば、これはアプリケーションの出力を完全に再現できません。出力の末尾に複数の改行がある場合は削除されます。ストリッピングはシェルのコマンド置換構成によって行われるため、これを防ぐには、代替コマンドの出力が改行文字で終わらないようにする必要があります。
    output="$(/usr/bin/some-application | sed 's/\\/\\\\/g'; echo a)"
    /usr/bin/zenity --error --text="${output%a}"
ただし、ダイアログボックスでは違いは明確に表示されません。

おすすめ記事