这个if-then语句是什么意思?

moo*_*765 7 command-line sh

在我的系统中玩耍,我偶然发现

~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share
Run Code Online (Sandbox Code Playgroud)

问自己为什么/usr/share在路径中出现两次,我发现以下/etc/alternatinves/x-session-manager链接到的片段 /usr/bin/startxfce4是负责任的:

~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share
Run Code Online (Sandbox Code Playgroud)

当我看这条线时

#!/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
.
.
.
Run Code Online (Sandbox Code Playgroud)

我很难理解这个 if 语句,对我来说它看起来像是字符串的比较,其中第一个总是假的,第二个总是真。

结合逻辑or,测试总是评估为true,因此我可以将行缩短为 if true; then或者我可以说我根本不需要 if 语句。

我的错误在哪里?还是这样写是为了迷惑像我这样的初学者?

Mel*_*ius 2

你说得对,命令

\n\n
test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"\n
Run Code Online (Sandbox Code Playgroud)\n\n

始终返回 true (0)。

\n\n

看起来有问题的文件是从更通用的版本生成的,但生成方式并不是最佳的。该脚本应该每次都询问实际路径,或者仅在生成的文件中保留相关分支。

\n\n

但是,此特定文件来自您的计算机上未生成的包 \xe2\x80\x93。这可能是需要修复/改进的\xe2\x80\xa6 您可以在Xfce Bugzilla上提交错误(如果 \xe2\x80\x99s 尚未存在)或自行修复。您可以克隆Xfce4 会话的 Git 存储库,还可以使用 Xfce4 开发人员的邮件列表与他们联系。祝改进代码好运!

\n