web-dev-qa-db-ja.com

このif-thenステートメントはどういう意味ですか?

私のシステムで遊んで、偶然偶然見つけた

~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share

/usr/shareがパスの2倍になっている理由を自問しましたが、/etc/alternatinves/x-session-managerへのリンクである/usr/bin/startxfce4の次のスニペットが原因であることがわかりました。

#!/bin/sh
.
.
.
if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
fi
export XDG_DATA_DIRS
.
.
.

線を見ると

if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then

このifステートメントを理解するのは困難です。私にとっては、最初のストリングが常に偽であり、2番目のストリングが常に真であるストリングの比較のように見えます。

論理orと組み合わせると、テストは常にtrueと評価されるため、行をif true; thenに短くするか、次のURLでifステートメントは必要ないと言えますすべて。

私の間違いはどこですか?それとも私のような初心者を混乱させるためにこのように書かれていますか?

7
mook765

あなたは正しい、コマンド

test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"

常にtrue(0)を返します。

問題のファイルがより一般的なバージョンから生成されたかのように見えますが、生成方法は最適ではありませんでした。スクリプトは、実際のパスを毎回要求するか、生成されたファイルに関連するブランチのみを保持する必要があります。

ただし、この 特定のファイルはパッケージからのもの –マシン上で生成されていません。これは修正または改善される可能性があります... Xfce Bugzilla にバグを報告するか(まだそこにない場合)、自分で修正できます。 Xfce4セッションのGitリポジトリ のクローンを作成できます。また メーリングリスト を使用してXfce4開発者と連絡を取ることもできます。コードを改善して頑張ってください!

2
Melebius

スクリプト/usr/bin/startxfce4はパーサーによって生成されているようです。 source code を見ると、対応するスニペットを見てみましょう。

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
fi
export XDG_DATA_DIRS

ここで、このifブロックの意味を確認できます。開発者は、パッケージマイテナーにXDG_DATA_DIRSへのカスタムパスを追加する機会を与え、スクリプトへの目的のパスを解析し、文字列@_datadir_@をこれで置き換えます。道。

これは、スクリプトの実行時にXDG_DATA_DIRSに含まれていないパスが解析された場合は完全に機能しますが、既にパスを解析した場合、XDG_DATA_DIRSに同じパスが2回表示されます。スクリプトの実行時にXDG_DATA_DIRSに存在します。

これは、標準のXDGフォルダー(/usr/share/usr/local/share)をスクリプトに解析しないことで回避できますが、それが可能かどうかはわかりません。

別の解決策は、ソースコードを次のように変更することです

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
  fi
else
  if test "x@_datadir_@" != "x/usr/local/share" -a "x@_datadir_@" != "x/usr/share"; then
    XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
  fi
fi
export XDG_DATA_DIRS

それはディレクトリ/usr/share/usr/local/shareのみをカバーしますが、@_datadir_@XDG_DATA_DIRSにすでに存在するかどうかを実際に確認する必要がありますが、誰がそれを行うかわかりません、私の知識はここで終わります。

その他:

スクリプトのこの部分にも同じことが当てはまります。

if test "x$XDG_CONFIG_DIRS" = "x"
then
  if test "x@_sysconfdir_@" = "x/etc"; then
    XDG_CONFIG_DIRS="/etc/xdg"
  else
    XDG_CONFIG_DIRS="/etc/xdg:@_sysconfdir_@/xdg"
  fi
else
  XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:@_sysconfdir_@/xdg"
fi
export XDG_CONFIG_DIRS

/etc/xdg /を解析して@_sysconfdir_@を置き換えると、重複したパス(/etc/xdg:/etc/xdgXDG_CONFIG_DIRS

ごあいさつ

私は開発者というよりはエンドユーザーなので、問題を完全に解決することはできません。 dessertmelebius のおかげで私を正しい方向に導いてくれたおかげで、少なくとも今はこのif-then-statementを理解しています。

この環境変数にパスを2回指定しても害はないと私は確信しているため、バグの報告は控えます。開発者にもっと価値のあることをさせましょう。

私の個人的な解決策

/usr/bin/startxfce4の67〜89行目を変更しました

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
fi
export XDG_DATA_DIRS

if test "x$XDG_CONFIG_DIRS" = "x"
then
  if test "x/etc" = "x/etc"; then
    XDG_CONFIG_DIRS="/etc/xdg"
      else
   XDG_CONFIG_DIRS="/etc/xdg:/etc/xdg"
  fi
else
  XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:/etc/xdg"
fi
export XDG_CONFIG_DIRS

if test "x$XDG_DATA_DIRS" = "x"
then
  XDG_DATA_DIRS="/usr/local/share:/usr/share"
fi
export XDG_DATA_DIRS

if test "x$XDG_CONFIG_DIRS" = "x"
then
  XDG_CONFIG_DIRS="/etc/xdg"
fi
export XDG_CONFIG_DIRS

もちろん、最初に元のファイルをバックアップしました。

1
mook765