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
}