xdg-screensaver lock 返回退出代码 4,即使它有效

xdg-screensaver lock 返回退出代码 4,即使它有效

在使用 KDE 安装的最新 openSUSE Tumbleweed 上,运行可以正常xdg-screensaver lock运行(就像我通过 UI 执行的那样,屏幕被锁定),但它返回退出代码 4,根据手册页,这意味着“行动失败。”可能出什么问题了?

答案1

这似乎是用于 的 shell 脚本内部的一个小错误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"因此你现在可以转到第行附近的函数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
}

相关内容