Zenity 진행 대화 상자의 취소 버튼은 어떻게 작동하나요?

Zenity 진행 대화 상자의 취소 버튼은 어떻게 작동하나요?

CancelZenity 창의 --progress버튼이 내 스크립트에서 작동하도록 만들려고 시도하는 동안 CancelZenity 매뉴얼 페이지에 제공된 예에서 버튼이 어떻게 작동하는지 이해하지 못했다는 것을 깨달았습니다.https://help.gnome.org/users/zenity/stable/progress.html.en

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

if [ "$?" = -1 ] ; then
        zenity --error \
          --text="Update canceled."
fi

Cancel이 스크립트가 실행 중일 때 버튼을 누르거나 다른 명령이 표시되지 않으면 프로세스가 중지되는 이유는 무엇 exit입니까 break?

저는 Zenity가 그래픽 인터페이스를 표시하고 필요한 실제 명령(예: 취소 등)을 시작하는 데 사용할 수 있는 종료 코드를 반환하는 프로그램일 뿐이라고 생각했지만 exitZenity는 더 복잡한 작업을 수행해야 하는 것처럼 보입니다. 예제의 명령은 버튼을 누를 때 실제로 중지할 이유가 있는 것처럼 보입니다.

Zenity가 더 복잡한 작업을 수행하고 있는 걸까요, 아니면 제가 뭔가를 잘못 이해한 걸까요? 저는 bash/sh 스크립팅을 처음 접했기 때문에 오해한 것 같습니다. 이것이 단지 Zenity 고유의 컴플리케이션이라면 그것이 어떻게 작동하는지에 대한 완전한 기술적 설명이 필요하지 않습니다. 제가 원하는 것은 그것이 안정적으로 사용될 수 있도록 충분한 설명입니다. 감사해요.

(또한 이 예가 왜 공식 매뉴얼에서 나온 것인지 묻고 싶습니다.실제로 작동하지 않습니다[Ubuntu 14.04] --errorZenity 창이 전혀 표시되지 않기 때문에 StackExchange는 연합 질문을 좋아하지 않는다고 가정하므로 오해할 수 있는 내용과 관련이 없는 한 괜찮습니다. )

관련 게시물: zenity 진행 표시줄을 사용하여 스크립트 종료(가장 높은 답변에 사용하라고 나와 있기 때문에 내 질문에 대답하지 않습니다. --auto-kill이 예에서는 사용하지 않고 프로세스가 취소됩니다.--auto-kill

답변1

()스크립트의 구문을 사용하면 sh다음을 시작할 수 있습니다.서브쉘. 서브셸을 다음과 같은 두 줄로 생각할 수 있습니다.

(echo foo)
sh -c "echo foo"

즉, 셸 스크립트에 를 처리하는 두 번째 프로세스가 있습니다 . 해당 하위 셸의 표준 출력은 ()파이프 기호(" ")를 통해 zenity의 표준 입력에 연결됩니다.|

zenity 창에서 취소 버튼을 클릭하면 zenity가 즉시 종료됩니다. 이 시점에서 서브쉘의 표준 출력은 유효하지 않게 됩니다. 이는 서브셸을 즉시 종료하지 않습니다. 그러나 echo서브셸의 다음 명령이 stdout에 쓰려고 하면 SIGPIPE쓰려는 파이프에 대한 판독기가 없다는 신호를 받게 됩니다. 프로세스의 표준 동작은 SIGPIPE종료입니다.

터미널에서 스크립트를 실행하고 "취소" 버튼을 클릭하면뒤쪽에업데이트가 zenity로 전송되었으며 sleep 명령이 계속 실행 중이고 sleep이 출력을 생성하지 않기 때문에 쉘 프롬프트가 즉시 반환되지 않습니다. 출력이 생성되고 방출되는 데 시간이 걸립니다 SIGPIPE.

이 동작을 원하지 않으면 SIGPIPE를 받은 후 쉘이 종료되지 않도록 지시해야 합니다.

#!/bin/sh
(
    trap -- '' PIPE
    echo "10"; sleep 1
    # ... etc, your normal script goes here
) |
zenity --progress ...

이 버전은 이를 무시 SIGPIPE하고 zenity가 종료되면 행복하게 계속됩니다. 하지만 이 경우 "취소" 버튼을 누르면 사용자가 매우 혼란스러워질 수 있으므로 zenity가 종료됩니다.아니요작업이 중단됩니다. 그냥 넘어가는 게 나을 수도 있겠네요 --no-cancel.

답변2

zenity는 취소 시 1(echo $?)을 방출합니다.

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

if [ $? -eq 1 ] ; then
        zenity --error \
          --text="Update canceled."
fi

관련 정보