私のシステムで遊んで、偶然偶然見つけた
~$ 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ステートメントは必要ないと言えますすべて。
私の間違いはどこですか?それとも私のような初心者を混乱させるためにこのように書かれていますか?
あなたは正しい、コマンド
test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"
常にtrue(0)を返します。
問題のファイルがより一般的なバージョンから生成されたかのように見えますが、生成方法は最適ではありませんでした。スクリプトは、実際のパスを毎回要求するか、生成されたファイルに関連するブランチのみを保持する必要があります。
ただし、この 特定のファイルはパッケージからのもの –マシン上で生成されていません。これは修正または改善される可能性があります... Xfce Bugzilla にバグを報告するか(まだそこにない場合)、自分で修正できます。 Xfce4セッションのGitリポジトリ のクローンを作成できます。また メーリングリスト を使用してXfce4開発者と連絡を取ることもできます。コードを改善して頑張ってください!
スクリプト/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/xdg
のXDG_CONFIG_DIRS
。
ごあいさつ
私は開発者というよりはエンドユーザーなので、問題を完全に解決することはできません。 dessert と melebius のおかげで私を正しい方向に導いてくれたおかげで、少なくとも今はこの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
もちろん、最初に元のファイルをバックアップしました。