XDG_DATA_DIRS 包含重复路径;怎么修?

XDG_DATA_DIRS 包含重复路径;怎么修?

我正在运行 Arch Linux 和 KDE,并且很想了解 mime 类型文件关联。

在调查我的系统时,我注意到这个问题:

$ echo $XDG_DATA_DIRS
/usr/share:/usr/share:/usr/local/share

请注意,路径/usr/share是重复的。我想知道如何解决这个问题以及如何解决它。

此外,我的系统没有“可以从环境变量/usr/local/share/applications/ 中删除该路径吗?”$XDG_DATA_DIRS如果是这样,怎么办?

我相信最终的结果应该是:

$ echo $XDG_DATA_DIRS
/usr/share

这是一些故障排除信息。以 root 身份运行时我看不到这些路径。这不会产生标准输出:

# echo $XDG_DATA_DIRS

在我的计算机上的普通用户帐户中,以下命令不会产生标准输出,并且返回值为1

$ grep -r XDG_DATA_DIRS /etc/profile.d/

除了二进制文件places.sqlite(在Firefox配置文件中)之外,此搜索没有找到任何匹配项:

find /home/myuser -mount -type f -exec grep -r XDG_DATA_DIRS= {} +

这也不会产生标准输出:

grep -r XDG_DATA_DIRS /etc/

到目前为止,我发现的唯一匹配是:

# grep -r XDG_DATA_DIRS= /usr
/usr/share/ECM/kde-modules/prefix.sh.cmake:export XDG_DATA_DIRS=@KDE_INSTALL_FULL_DATADIR@:${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}

所以...

pacman -F /usr/share/ECM/kde-modules/prefix.sh.cmake
usr/share/ECM/kde-modules/prefix.sh.cmake is owned by extra/extra-cmake-modules 5.66.0-1

Arch Linux - extra-cmake-modules 5.66.0-1(任何)https://www.archlinux.org/packages/extra/any/extra-cmake-modules/

我希望这个包不会搞砸我的哑剧类型关联......

在另一台设备上全新安装 Arch 的新用户帐户中,以下三个命令不会产生标准输出:

echo $XDG_DATA_DIRS
grep -r XDG_DATA_DIRS /etc/profile.d/
grep -r XDG_DATA_DIRS= /usr

答案1

此外,我的系统没有 /usr/local/share/applications/ 可以从 $XDG_DATA_DIRS 环境变量中删除该路径吗

/usr/local/share/applications不在$XDG_DATA_DIRS您粘贴的值中,因此无需删除不存在的值

如果您 grep -r XDG_DATA_DIRS /usr

您将看到多次出现 XDG_DATA_DIRS。

我希望这个包不会搞砸我的哑剧类型关联......

不,它不会搞砸任何事情。它也只搜索这些目录

在另一台设备上全新安装 Arch 的新用户帐户中,以下三个命令不会产生标准输出

确切地说,您在不同的系统中会得到不同的值。您安装的那些软件包以及为该特定用户定义的环境变量将定义将搜索数据文件的目录。如果同一个值被定义两次,那么它就会出现两次。这样做并没有什么奇怪的,因为有时包不协调在一起。grep /usr//opt而且$HOME你肯定会在某个地方找到罪魁祸首。如果不grep /;)

答案2

如果您使用的是zshshell,您可以添加到您的~/.zshrc

typeset -UT XDG_DATA_DIRS xdg_data_dirs

然后$XDG_DATA_DIRS标量变量将被T连接到 ,$xdg_data_dirs这使得操作变得更加容易,并且元素被设置U为唯一的-U

然后要删除不存在的组件,您可以添加:

xdg_data_dirs=($^xdg_data_dirs(N-/))

这将删除不是实际目录的组件(/在符号链接解析后(-))

答案3

要删除 bash 中的重复目录和不存在的目录:

#!/usr/bin/env bash

XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share
IFS=: read -ra xdg_data_dirs <<< "$XDG_DATA_DIRS"
declare -p xdg_data_dirs
for d in "${xdg_data_dirs[@]}"; do
    test -d "$d" || continue
    [[ :$result: != *:$d:* ]] || continue
    result+="${result+:}$d"
done
XDG_DATA_DIRS=$result

你在你的主目录中搜索过吗?

答案4

检查 /usr/bin/x-session-manager 和 /usr/bin/startxfce4 这两个在 XDG_DATA_DIRS 中重复的 /usr/share。

相关内容