다음 명령을 사용하여 오류 창을 표시하겠습니다 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/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')"
엄밀히 말하면 이는 애플리케이션의 출력을 완벽하게 재현하지 못합니다. 출력 끝에 여러 줄 바꿈이 있으면 제거됩니다. 스트리핑은 쉘의 명령 대체 구성에 의해 수행되므로 이를 방지하려면 대체 명령의 출력이 개행 문자로 끝나지 않도록 해야 합니다.
output="$(/usr/bin/some-application | sed 's/\\/\\\\/g'; echo a)"
/usr/bin/zenity --error --text="${output%a}"
그러나 대화 상자에서는 차이점이 명확하게 나타나지 않습니다.