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"に移動できます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
}

関連情報