我在 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 生成一个列表。
使用uniqpath
和listpath
(来自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