在使用 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
}