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"
に移動できます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
;;
すべてのケースステートメントにはsuspend
:この行の末尾がありますが、result=$?
ケースステートメント内には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
これは実際にすべてが完全に実行されているが、スクリプトにこの1行がないことを意味します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
}