摆脱 ~/.profile 中设置的类似路径的环境变量中的欺骗

摆脱 ~/.profile 中设置的类似路径的环境变量中的欺骗

[Ubuntu 19.10 与gdm]

以下是我的内容$HOME/.profile

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

XDG_DATA_DIRS=$HOME/PRATAP/:$XDG_DATA_DIRS

我在上面的文件中添加了最后一行,即XDG_DATA_DIRS=$HOME/PRATAP/:$XDG_DATA_DIRS

当我重新启动..

$ env | grep XDG_DATA_DIRS
XDG_DATA_DIRS=/home/admin/PRATAP/:/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
$

注销并登录..

$ env | grep XDG_DATA_DIRS
XDG_DATA_DIRS=/home/admin/PRATAP/:/home/admin/PRATAP/:/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop

再次注销并登录..

$ env | grep XDG_DATA_DIRS
XDG_DATA_DIRS=/home/admin/PRATAP/:/home/admin/PRATAP/:/home/admin/PRATAP/:/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop

我添加的路径是重复的,即$HOME/PRATAP/

有没有办法阻止这种情况重复发生?

答案1

您可能想要清理 XDG_DATA_DIRS 变量。您仅在注销/登录时才在环境变量中遇到欺骗的事实与您所描述的内容、.profile 文件的内容以及下面的一般解决方案一致

首先定义可执行脚本pathclean(改编自 @Gilles' 2012 年 6 月 17 日在 Stackexchange 上发表的帖子 # 40749,由于某种原因我找不到其 url):

$ cat pathclean
#!/usr/bin/bash
# Cleans up PATH variable 
# Script accepts exactly 2 arguments
dedup_path() {
    if [ -n "$1" ]; then # TRUE if length of string is !=0
            OLPATH=${1}:; NUPATH=""
        while [ -n "$OLPATH" ]; do  
            x=${OLPATH%%:*}   # keep 1st entry in string $OLPATH
            case $NUPATH: in
                *:"$x":*) ;;                    # already there
                *) NUPATH=$NUPATH:$x ;; # not there yet
            esac
            OLPATH=${OLPATH#*:} # remove 1st entry in $OLPATH
        done
        NUPATH=${NUPATH#:}
        unset OLPATH x
    fi
    echo "$NUPATH"
}

echo $( sed -e 's/::/:/g' -e 's/:$//' <(dedup_path "${2}") )
exit 0

只需将其放在pathclean您通常保存脚本的位置即可。这可能是在 或$HOME/.local/share//opt/bin/。就您而言,$HOME/.local/share/ 可能是最好的位置。然后使用 使其可执行$ chmod +x $HOME/.local/share/pathclean

最后不要忘记添加$HOME/.profile 以下行:

  XDG_DATA_DIRS=$($HOME/.local/share/pathclean XDG_DATA_DIRS "$XDG_DATA_DIRS").

重要的是上面的行要放置在最后你的$HOME/.profile

该脚本会从您的 $HOME/.profile 自动运行,该脚本由您的登录管理器在 GUI 登录时获取一次。

这应该可以让您远离受骗者。您还可以毫无问题地将 dupe-cleanup 应用于您的 PATH env-var。

相关内容