路径变量在做 source ~/.bashrc 后变得越来越长


这可能是

一个愚蠢的问题,但我想知道如何避免这个问题。

在我的~/.bashrc文件中,我添加了一些本地路径。以下是 PYTHONPATH 的一个示例。在我的工作环境中,我需要时不时地做"source ~/.bashrc",下面的 PYTHONPATH 变得越来越长,这很烦人。

与其附加到现有的 PYTHONPATH,不如将其附加到"干净"的 PYTHONPATH 中可能会更好。有没有这样做?

export PYTHONPATH=$PYTHONPATH:$CLIENTS:$EXPERIMENTAL/my_pythonlib:/mnt/src/cloud/chanwcom/chanwcom-speech/mnt/experimental/users/chanwcom/bin:$CK_MEDIA_FRAMEWORK

编辑:我回答了关于保持干净路径的问题。
@mklement0正确地评论说,OP正在谈论PYTHONPATH。我可以纠正我的答案,但也许其他读者对 PATH 也有同样的问题。
亲爱的Chanwcom,您可以使用下面的方法,只需要重命名变量即可。

在扩展路径之前添加一些测试。选择其中一个示例。

if [[ -z "${my_clean_path}" ]]; then
   my_clean_path="${PATH}"
fi
# some more commands
PATH="${my_clean_path}:${PYTHONPATH}"

if [[ -z "${python_added}" ]]; then
   PATH="${PATH}:${PYTHONPATH}" # PATH += also possible here
fi

或(我最喜欢的,没有额外的变量)

if [[ "${PATH}" != *${PYTHONPATH}* ]]; then
   PATH="${PATH}:${PYTHONPATH}" # PATH += also possible here
fi

或者在更改路径之前打开第二个外壳。 退出到第一个外壳并打开一个新的新外壳。

解决这个问题

的"正确"方法是正如Chepner在评论中提到的 - 在登录时运行的.bash_profile中修改您的PYTHONPATH,而不是在每个shell上运行.bashrc

如果无法调整将重复项追加到路径的脚本或工具,则可以通过删除非唯一值来清理内容。

这是我使用的一个策略,它涉及将我的$PATH转换为数组,反转数组(即将数组值转换为关联数组的下标),然后从数组索引重建路径:

if [[ ${BASH_VERSINFO[0]} -ge 4 ]]; then
        path_a=( ${PATH//:/ } )
        declare -A path_b=()
        for i in ${path_a[@]}; do path_b[$i]=1; done
        IFS=: eval 'PATH="${!path_b[*]}"'
fi
export PATH

你可以很容易地为 PYTHONPATH 调整它。

请注意,关联数组是在 Bash 版本 4 中引入的,因此它们可能无法在 OSX 中的默认 bash 中使用。不过,在其他任何现代的地方,你都应该没问题。

另请注意,如果路径中的任何目录包含冒号,则此解决方案将中断。但我认为,在这种情况下,你的道路无论如何都会被打破。

另外,请注意,此解决方案使用eval ,有些人认为这是危险的,不干净的,有气味的。 不过,在正确的环境中,它可以是一种精美的奶酪。

最新更新