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)"

둘째, 애플리케이션에서 나오는 모든 백슬래시를 두 배로 늘리고 문자를 바꿔야 합니다. 를 사용하여 이 작업을 수행할 수 있습니다 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}"
그러나 대화 상자에서는 차이점이 명확하게 나타나지 않습니다.

관련 정보