Skip to content

Unix / Linux - 环境

Shell 环境包含定义命令行会话行为和上下文的设置和变量。理解和自定义此环境是高效使用类 Unix 系统的关键。

变量存储数据(文本、数字、路径)并使用名称引用。

  • **Shell 变量:**仅存在于当前的 shell 会话中。它们不会传递给从该 shell 启动的程序。
  • **环境变量:**由从当前 shell 启动的子进程(程序或子 shell)继承。它们定义了更广泛的执行环境。

设置变量(语法在不同的 shell 之间略有差异,例如 bash、zsh、sh):

# 设置一个 SHELL 变量(Bourne 家族 shell 的常用语法:bash, zsh, sh)
# 等号周围不能有空格!
MY_VAR="Hello Shell"
# 使用 '$' 访问变量的值
$ echo $MY_VAR
Hello Shell
# 使用 'export' 将 shell 变量设置为环境变量
export MY_VAR
# 或者一步到位设置并导出
export EDITOR="vim"

要查看当前设置的所有环境变量:

$ env
# 或者
$ printenv

要查看特定环境变量的值:

$ echo $HOME
/home/user
$ printenv PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/user/bin

当您登录或启动新的 shell 会话时,shell 会读取配置文件来设置环境、定义别名、函数和变量。具体读取的文件取决于所使用的 shell(例如,bash、zsh)以及它是否是登录 shell 或交互式非登录 shell。

常见的配置文件包括:

  • 系统范围设置:通常在 /etc/profile、/etc/bash.bashrc (对于 bash)、/etc/zsh/zshrc (对于 zsh) 中。由系统管理员管理。
  • 用户特定设置(在您的家目录 ~ 中):
  • **Bash:**对于 登录 shell,读取 ~/.bash_profile、~/.bash_login 或 ~/.profile(找到的第一个)。对于 交互式非登录 shell(登录后打开的大多数终端窗口),读取 ~/.bashrc。通常,.bash_profile 会被设置为简单地加载 .bashrc。
  • **Zsh:**读取 ~/.zshenv(总是读取)、~/.zprofile(登录)、~/.zshrc(交互式)、~/.zlogin(在 zshrc 之后登录)。大多数用户自定义设置放在 ~/.zshrc 中。
  • **传统 Bourne Shell (sh):**对于登录 shell,读取 /etc/profile,然后是 ~/.profile。

**一般实践:**将您大多数个人环境设置(PATH 修改、别名、自定义函数、提示符设置)放在 ~/.bashrc(对于 Bash)或 ~/.zshrc(对于 Zsh)中。专门在登录时需要的设置(可能很少见)放在 ~/.bash_profile 或 ~/.zprofile 中。

几个标准的环境变量显著影响 shell 的行为。

一个冒号分隔的目录列表(:)。当您输入一个命令(例如,ls)时,shell 会 按顺序 在这些目录中搜索可执行文件。如果在 PATH 中的任何目录都找不到,就会出现 ‘command not found’ 错误。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/.local/bin:/home/user/bin

将您自己的自定义脚本目录(~/scripts)添加到 PATH 中(将这行添加到您的 ~/.bashrc 或 ~/.zshrc):

export PATH="$HOME/scripts:$PATH"

(前置添加确保您的脚本优先于同名系统脚本被找到。后置添加($PATH:$HOME/scripts)也很常见)。

您的家目录的绝对路径。

$ echo $HOME
/home/alice

您的登录用户名。

$ echo $USER
alice

您的默认登录 shell 程序的路径。

$ echo $SHELL
/bin/bash

指定您正在使用的终端模拟器的类型(例如,xterm、xterm-256color、linux、screen)。程序使用此信息来确定如何正确绘制输出(例如,使用颜色、清屏)。

$ echo $TERM
xterm-256color

不正确的 TERM 设置可能导致像 vim 或 less 这样的程序输出乱码。

指定其他程序将使用的默认文本编辑器(例如,git 用于提交消息,crontab -e)。VISUAL 通常优先于全屏编辑器,EDITOR 优先于行编辑器。

# 在 ~/.bashrc 或 ~/.zshrc 中设置
export VISUAL="vim"
export EDITOR="nano"

当前工作目录。当您使用 cd 命令时,shell 会自动更新它。

$ pwd
/home/alice/projects
$ echo $PWD
/home/alice/projects

PS1 定义了主命令提示符字符串。它可以包含特殊转义序列来显示用户信息、主机名、当前目录、时间等信息。自定义 PS1 是个性化 shell 的常见方式。

PS2 定义了次要提示符,当 shell 期望更多输入时显示(例如,在开引号或括号之后)。

Bash/Zsh 的 PS1 设置示例(通常在 .bashrc/.zshrc 中设置):

# 显示 [用户@主机名 当前目录]$ (root 用户则显示 #)
export PS1='[\u@\h \W]\$ '

现代提示符通常包含颜色和 Git 分支信息,这涉及到更复杂的 PS1 设置。

其他变量,如 LANG、LC_* 控制语言和本地化设置。LD_LIBRARY_PATH 影响动态链接(谨慎使用)。

通过修改 shell 配置文件中的环境变量,您可以根据您的需求定制 Unix/Linux 命令行体验。