展开$PATH问题$HOME/bin被设置了两次

展开$PATH问题$HOME/bin被设置了两次

我在 xubuntu bionic 中使用 shell bash。

我将尝试通过 $HOME/.profile 为我的用户扩展 $PATH。

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

结果有点出乎意料。

echo $PATH
/home/alex/.local/bin:/home/alex/bin:/home/alex/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$HOME/bin 设置了两次。我该如何避免?

在 $HOME/.bashrc 中没有任何声明。

答案1

Ubuntu 已经配置为自动添加$HOME/bin到路径。

您提到您的发行版是服务器转换为桌面,我不确定这会产生什么影响,但您可以检查:

$ cat ~/.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 directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

听起来这正在被执行,而您正在手动做的是将文件的最后一行加倍。


使用grep查找所有引用

您可以使用 grep 查找所有$HOME/bin引用的文件:

grep -rnw --exclude-dir={proc,root,run,sys,/tmp,tmpfs,var} '/' -e "$HOME/bin"

答案2

我使用 Stephen Collyer 的“Bash Path Functions”(参见他的文章Stephen Collyer 的文章Linux Journal 中的“冒号分隔列表”)。它允许我在 shell 编程中使用“冒号分隔列表”作为数据类型。例如,我可以通过以下方式生成当前目录中所有目录的列表:

dirs="";for i in * ; do if [ -d $i ] ; then addpath -p dirs $i; fi; done  

然后,listpath -p dirs 生成一个列表。

使用uniqpathlistpath(来自bash_path_funcs),可以简单地:

walt@bat:~(0)$ PATH=$HOME/bin:$PATH
+walt@bat:~(0)$ listpath
/home/walt/bin
/home/walt/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/home/walt/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

+walt@bat:~(0)$ uniqpath -p PATH
+walt@bat:~(0)$ listpath
/home/walt/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/gameswalt@bat:~(0)$ PATH=$HOME/bin:$PATH

相关内容