在我的系统中玩耍,我偶然发现
~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share
问自己为什么/usr/share
在路径中有两次,我发现下面
/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 语句,对我来说,它看起来像是一个字符串的比较,第一个总是假的,第二个总是真的。
结合逻辑or
,测试总是评估为true,所以我可以将行缩短到
if true; then
或者我可以说我根本不需要 if 语句。
我的错误在哪里?还是这样写是为了迷惑像我这样的初学者?
你是对的,命令
始终返回 true (0)。
看起来有问题的文件是从更通用的版本生成的,但生成方式不是最佳的。脚本应该每次都询问实际路径,或者只在生成的文件中保留相关分支。
然而,这个特定的文件来自一个包——不是在你的机器上生成的。这很可能需要修复/改进……您可以在Xfce Bugzilla上提交错误(如果它还没有出现)或自己修复。您可以克隆Xfce4 会话的 Git 存储库,也可以使用 Xfce4 开发人员的邮件列表与他们取得联系。祝你改进代码好运!
该脚本
/usr/bin/startxfce4
似乎是由解析器生成的,我们可以看到,当我们查看源代码时,我们再看一下对应的代码片段:在这里我们可以看到这个 if-block 的含义,开发人员
XDG_DATA_DIRS
通过解析脚本所需的路径并@_datadir_@
用这个路径替换字符串来给 package-maintainers 添加自定义路径的机会。如果解析的路径在脚本运行时不包含在其中,这将完美地工作,但是如果我们解析在脚本运行时已经存在的路径,
XDG_DATA_DIRS
它将导致相同的路径出现两次。XDG_DATA_DIRS
XDG_DATA_DIRS
这可以通过不将标准 XDG 文件夹 (
/usr/share
,/usr/local/share
) 解析到脚本来避免,但我不知道这是否可能。另一种解决方案是将源代码更改为
那将仅涵盖目录
/usr/share
,/usr/local/share
尽管确实应该检查是否@_datadir_@
已经存在XDG_DATA_DIRS
,但是我不知道该由谁来做,我的知识到此为止。此外:
这同样适用于脚本的这一部分:
当我们解析
/etc/xdg
/ 来替换@_sysconfdir_@
它时,它会导致一个重复的路径(/etc/xdg:/etc/xdg
在XDG_CONFIG_DIRS
.问候
我是最终用户,远非开发人员,所以我无法完全解决问题。感谢甜点和melebius把我推向了正确的方向,至少我现在理解了这个 if-then-statement。
我相信在这个环境变量中有两次路径是没有害处的,所以我会避免报告错误。让开发者做更多有价值的事情。
我的个人解决方案
我更改了第 67-89 行
/usr/bin/startxfce4
至
当然,我先备份了原文件。