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

本文由mdnice多平台发布


科学冷冻工厂
29 声望2 粉丝