PATH
PATH 环境变量由 shell 或 libc 读取来查找并执行程序,这就是当在终端中键入 ls 时 shell 可以找到 /bin/ls 的方式。
在基于 Debian 的桌面系统上,默认 PATH 变量如下所示:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
实际上,很多设置并不是必需的。
在现代的操作系统中,/{bin,sbin}/ 文件夹通常是 /usr/{bin,sbin}/ 的符号链接。
对我来说,/usr/local 文件夹没什么用,如果我编译或安装软件,我更倾向于将它们放在默认的位置。
有时候在编译之前我会忘记运行 ./configure --prefix=/usr 命令,因此我把 /usr/local 设置成了指向 /usr 的符号链接(通过在 /usr 目录下执行 ln -s /usr local 命令)。
对于那些在公共软件仓库中找不到,且需要作为后台进程运行的软件,我会使用 /opt 目录。
这样做可以使得路径更短:
PATH=/usr/sbin:/usr/bin:/usr/games
为了更进一步地优化系统,我删除了 /usr/games 目录,因为我是通过 .desktop 文件来启动图形用户界面程序(例如游戏)。这些 .desktop 文件通常存放在${XDG_DATA_DIRS}/applications
目录下。
到了 2024 年,我的做法就是这样,我计划利用根目录下的符号链接,以便得到更简短的路径字符串:
PATH=/sbin:/bin
最终,/usr/sbin 可能会合并到/usr/bin,因此只需要/bin。
仅仅在 /etc/environment 文件中配置 PATH 环境变量是不够的。
当 shell 启动后,它还会读取 /etc/profile 和用户的 ~/.profile 文件。
像 Rust 或 Python 这样的现代编程环境,往往会自动向 PATH 环境变量添加新的路径。
不过,我更喜欢明确控制 PATH 中的内容,因此我会通过创建符号链接的方式来管理:
$ file ~/bin ~/bin-rust ~/bin-py ~/bin-go ~/bin-js
~/bin: directory
~/bin-rust: symbolic link to .cargo/bin
~/bin-py: symbolic link to .local/bin
~/bin-go: symbolic link to .golang/bin
~/bin-js: symbolic link to .nvm/versions/node/v22.1.0/bin
我还希望系统二进制文件优先于用户一,因此我的 .profile 在重新分配时确保 $PATH 首先出现:
# ...
# Hide default GOPATH
if [ -d "$HOME/.golang" ] ; then
GOPATH="$HOME/.golang"
fi
# User's local bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$PATH:$HOME/bin"
fi
# RUST local bin if it exists
if [ -d "$HOME/bin-rust" ] ; then
PATH="$PATH:$HOME/bin-rust"
fi
# Python local bin if it exists
if [ -d "$HOME/bin-py" ] ; then
PATH="$PATH:$HOME/bin-py"
fi
# Golang local bin if it exists
if [ -d "$HOME/bin-go" ] ; then
PATH="$PATH:$HOME/bin-go"
fi
# NodeJs local bin if it exists
if [ -d "$HOME/bin-js" ] ; then
PATH="$PATH:$HOME/bin-js"
fi
export GOPATH
export PATH