xdg-screensaver 잠금이 작동하더라도 종료 코드 4를 반환합니다.

xdg-screensaver 잠금이 작동하더라도 종료 코드 4를 반환합니다.

KDE와 함께 설치된 최신 openSUSE Tumbleweed에서는 실행이 xdg-screensaver lock잘 작동하지만(UI를 통해 수행하는 것처럼 화면이 잠겨 있음) 종료 코드 4를 반환합니다. 매뉴얼 페이지에 따르면 "작업이 실패했습니다."라는 의미입니다. 문제?

답변1

이것은 사용된 쉘 스크립트 내의 작은 버그인 것 같습니다 xdg-screensaver. 나는 또한 openSUSE Tumbleweed동일한 종료 코드를 테스트하고 얻었습니다. 어쩌면 우리는 동일한 버전을 가지고 있으므로 이 질문의 오류와 해결책이 두 가지 모두에 적용될 것입니다.

파일은 디렉토리에 xdg-screensaver있으며 다음을 사용하여 파일을 열고 편집해야 합니다./usr/bin

sudo -e /usr/bin/xdg-screensaver

#In zsh you can use:
sudo -e =xdg-screensaver

문제를 디버깅하려면:

해당 줄 주위에 593다음 섹션이 표시됩니다.

case "$DE" in
  kde)
    if [ -n "${KDE_SESSION_VERSION}" ]; then
      screensaver_freedesktop "$1"
    else
      screensaver_kde3 "$1"
    fi
    ;;

내 경우(아마도 여러분도 마찬가지겠지만) 실행될 줄은 이므로 screensaver_freedesktop "$1"이제 line 근처의 함수로 이동할 수 있습니다 741. 해당 섹션에서 다음 코드를 볼 수 있습니다.

case "$1" in
    suspend)
    dbus-send --session \
              --dest=org.freedesktop.ScreenSaver \
              --type=method_call \
              --print-reply \
              --reply-timeout=2000 \
              /ScreenSaver \
              org.freedesktop.ScreenSaver.Inhibit \
              string:$window_id \
              string:xdg-screensaver \
              | grep uint32 | cut -d ' ' -f 5 >| "$screensaver_file.cookie" \
              2> /dev/null
    result=$?
    ;;
                                                                              
    #... more code ...
                                                                              
    lock)
    dbus-send --session \
              --dest=org.freedesktop.ScreenSaver \
              --type=method_call \
              /ScreenSaver \
              org.freedesktop.ScreenSaver.Lock \
              2> /dev/null
    ;;

모든 Case 문에는 suspend:이 줄 끝에 있지만, result=$?Case 문 안에는 lock없습니다 . 어쩌면 개발자가 해당 줄을 추가하는 것을 잊었을 수도 있습니다. 따라서 여기서 해결책은 다음 줄을 추가하는 것입니다.

 lock)
    dbus-send --session \
              --dest=org.freedesktop.ScreenSaver \
              --type=method_call \
              /ScreenSaver \
              org.freedesktop.ScreenSaver.Lock \
              2> /dev/null
    result=$?
    ;;

그런데 다음 명령을 실행하면:

dbus-send --session \
              --dest=org.freedesktop.ScreenSaver \
              --type=method_call \
              /ScreenSaver \
              org.freedesktop.ScreenSaver.Lock \
              2> /dev/null

종료 코드를 인쇄한 후 상태 코드를 echo $?받게 됩니다 . 0이는 실제로 모든 것이 완벽하게 실행되고 있지만 스크립트에 이 한 줄이 누락되었음을 의미합니다 result=$?.

result변수는 종료 상태에 사용됩니다. 파일의 마지막 몇 줄에서 이를 확인할 수 있습니다.

if [ $result -eq 0 ]; then
    exit_success
else
    exit_failure_operation_failed
fi

이 기능의 역할은 다음 exit_failure_operation_failed과 같습니다.

exit_failure_operation_failed()
{
    if [ $# -gt 0 ]; then
        echo "xdg-screensaver: $@" >&2
    fi

    exit 4
}

관련 정보