想象一下你有一间神奇的工作室。每次你推门而入,你顺手的工具总是摆在固定的位置,灯光会自动调节到你最喜欢的亮度,甚至上次做到一半的模型还好端端地放在桌上等你。 Linux Shell的“环境”就扮演着这样一个角色,它像一位贴心的管家,为你打理着工作空间的每一个细节。

这个环境并非什么神秘代码,而是一系列“记忆卡片”的集合,我们称之为“环境变量”。这些卡片上记录着各种各样的信息,比如你的名字(USER)、你的“家”在何处(HOME),以及当你要运行一个程序时,系统应该去哪些“工具箱”里寻找(PATH)。
许多程序在启动时,都会先翻阅这些卡片,以便根据你的偏好来调整它们的工作方式。
环境变量是Shell中存储信息的容器,它们以键值对的形式存在。每个环境变量都有一个名称和一个值,就像变量名和变量内容的组合。这些变量在Shell启动时被设置,并在整个会话期间保持有效。
环境变量是Shell环境的核心组成部分,它们决定了Shell的行为方式、程序的运行环境,以及用户的工作体验。
环境变量在Linux系统中扮演着多个重要角色:
想知道你的Shell环境里都记了些什么吗?最直接的方法就是请它把所有的“记忆卡片”都展示给你看。你可以使用printenv命令,这个名字很直白,就是“打印环境”的意思。
|$ printenv
当你执行这个命令,屏幕上会迅速滚过一长串名字=内容格式的列表。这看起来可能有点眼花缭乱,但别担心,我们暂时不需要理解每一个。
如果你只想知道某一张特定卡片的内容,比如想看看你的“家”在哪里,可以用echo命令,并在变量名前加上一个$符号,这个符号是在告诉Shell:“嘿,我想要的不是'HOME'这四个字母,而是它所代表的那个地方”。
|$ echo $HOME /home/me $ echo $USER me $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
在Linux系统中,我们可以通过使用export命令来设置或修改环境变量。这个命令就像是给Shell发出一个指令,告诉它要记住某个特定的信息。
比如说,当我们想要创建一个新的环境变量或者更新一个已有的变量时,export命令就派上用场了。
它不仅仅是简单地存储信息,还能让这些信息在Shell的子进程中也能被访问到。这样一来,我们就可以在不同的程序和脚本之间共享这些重要的数据。
|# 设置一个新的环境变量 $ export MY_VARIABLE=“Hello World” # 查看新设置的变量 $ echo $MY_VARIABLE Hello World # 修改现有变量 $ export PATH=$PATH:/home/me/bin
Shell环境中的变量名通常是大写的,这是一种长久以来的约定俗成。当你看到像PATH、HOME或USER这样的全大写变量时,可以猜测它很可能是一个重要的环境变量。

在众多的环境变量中,有几张“卡片”你绝对应该认识一下,因为它们对你的Shell日常操作至关重要。
这张卡片记录了你个人文件夹的路径,也就是你的“家”目录。每当你登录系统或者打开一个新的终端窗口,通常就会从这里开始。它是你存放个人文件和配置的大本营。
|$ echo $HOME /home/me $ cd $HOME $ pwd /home/me
这个变量的作用是存储当前登录到系统的用户的用户名。每当我们需要确认自己以哪个身份在系统中操作时,这个变量就派上用场了。它就像是一个名牌,时刻提醒我们当前的用户身份。
|$ echo $USER me $ whoami me
这个变量的作用是告诉我们当前正在使用的Shell类型。Shell就像是我们与计算机沟通的“翻译官”,而这个变量则是告诉我们正在使用哪位“翻译官”。 不同的Shell有不同的特性和功能,比如Bash、Zsh等。通过查看这个变量,我们可以知道自己当前的Shell环境,从而更好地利用其特性。
|$ echo $SHELL /bin/bash
这张卡片可能是最重要的之一。想象一下,当你在终端输入ls命令时,Shell是如何知道去哪里找到这个程序的呢?它不会搜遍整个电脑,而是会查看PATH这张卡片。
PATH里面记录了一系列用冒号隔开的目录路径,就像一个“可信工具箱列表”。Shell会按照列表上的顺序,逐个检查这些工具箱,直到找到你要的那个程序。
|$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # 添加新的路径到PATH $ export PATH=$PATH:/home/me/bin
这个变量的作用是指引系统去哪里寻找共享库文件。共享库文件就像是程序运行时所需的“工具箱”,而这个变量则是告诉系统这些“工具箱”存放在哪些地方。 当我们运行一个需要共享库的程序时,系统会根据这个变量中指定的路径去寻找所需的库文件,从而确保程序能够顺利运行。
|$ echo $LD_LIBRARY_PATH /usr/lib:/usr/local/lib
这张卡片决定了你命令提示符的样子。就是你输入命令前,光标前面那串文字,比如[me@linuxbox ~]$。你可以修改它,让它显示更多有用的信息,或者干脆换成你喜欢的颜色或表情符号,让你的终端与众不同。
|$ echo $PS1 [\u@\h \W]\$ # 自定义提示符 $ export PS1=“[\u@\h \w]\$ ” [me@linuxbox /home/me]$
这个变量的作用是决定Shell能够记住多少条你曾经输入过的命令。Shell就像是一个忠实的助手,它会记录下你每一次的命令输入,方便你以后查阅和重复使用。 而这个变量就像是助手的记忆容量,容量越大,它能记住的命令就越多。通过调整这个变量的值,我们可以控制助手的记忆力,让它更好地为我们服务。
|$ echo $HISTSIZE 1000 # 增加历史记录数量 $ export HISTSIZE=2000
这个变量的作用是用来控制Shell历史记录的具体行为方式。它决定哪些命令会被记录下来,哪些会被忽略。 通过设置这个变量,我们可以让Shell更智能地管理历史记录,比如忽略重复的命令或者以空格开头的命令,从而让我们的命令历史更加简洁和有序。
|$ echo $HISTCONTROL ignoredups # 忽略重复命令和以空格开头的命令 $ export HISTCONTROL=ignoreboth
这个变量的作用是用来设置系统的默认语言环境。通过设置这个变量,我们可以让系统以我们熟悉的语言与我们交流,从而提高使用的便利性和舒适度。
|$ echo $LANG en_US.UTF-8 # 设置为中文 $ export LANG=zh_CN.UTF-8
这个变量的作用是用来覆盖所有其他地区相关的设置。当你设置了LC_ALL变量时,它会优先于其他地区变量(如LANG、LC_TIME等),确保系统的所有地区设置都按照你指定的方式运行。
这样一来,无论是日期格式、货币符号,还是语言显示,都会遵循你在LC_ALL中设定的规则。这对于需要在不同地区环境中切换的用户来说,提供了极大的便利和灵活性。
|$ echo $LC_ALL en_US.UTF-8

这些环境变量不是凭空出现的。当你启动一个Shell会话时,它会像飞行员起飞前检查仪表盘一样,阅读一系列被称为“启动文件”的配置脚本。 这些文件就像是Shell的“启动清单”,告诉它应该设置哪些环境变量,定义哪些快捷方式。
对于我们普通用户来说,最重要的启动文件通常是放在你家目录下的~/.bashrc。
这个文件是为非登录式Shell准备的,通俗地说,就是你在图形界面里打开一个新的终端窗口时,它就会被读取。
|$ ls -la ~/.bashrc -rw-r--r-- 1 me me 3526 Mar 20 10:30 /home/me/.bashrc
另一个重要的文件是~/.bash_profile(或在某些系统中是~/.profile),它主要在用户登录系统时(比如在文本模式下输入用户名和密码)被读取。
|$ ls -la ~/.bash_profile -rw-r--r-- 1 me me 220 Mar 20 10:30 /home/me/.bash_profile
当用户退出Shell时,系统会自动执行这个文件中的命令。这个文件的主要作用是帮助用户在退出时进行一些必要的清理工作。 比如说,你可以在这里添加一些命令来删除临时文件,或者是记录下你这次会话的一些重要信息,以便下次使用时参考。这样一来,每次退出Shell时,你的系统都会保持整洁和有序。
|$ ls -la ~/.bash_logout -rw-r--r-- 1 me me 220 Mar 20 10:30 /home/me/.bash_logout
有趣的是,~/.bash_profile文件里通常会包含一条指令,去读取~/.bashrc的内容。这样一来,无论你如何启动Shell,~/.bashrc里的设置大都能生效。
因此,对于初学者而言,把你的个性化配置放进~/.bashrc文件里,通常是个不错的选择。
启动文件的执行顺序如下:
/etc/profile → ~/.bash_profile → ~/.bashrc~/.bashrc现在,激动人心的时刻到了!我们将亲手修改~/.bashrc文件,为我们的Shell添加一些实用的新功能。
在对任何重要的配置文件动刀之前,务必先创建一个备份。这就像给文件拍一张快照,如果后面不小心改错了,随时可以恢复到原始状态。一句简单的cp命令就能搞定:
|$ cp ~/.bashrc ~/.bashrc.bak
这样,我们就把~/.bashrc的内容复制到了一个新文件~/.bashrc.bak中。记住这个好习惯,它能在未来为你省去很多麻烦。
要修改文件内容,我们需要一个文本编辑器。Linux上有各式各样的编辑器,从简单易用的nano,到功能强大的vim和emacs。
对于新手来说,nano是一个非常友好的选择,它的操作界面下方有清晰的快捷键提示。
|$ nano ~/.bashrc
这个命令会用nano编辑器打开你的.bashrc文件。
用键盘的方向键,将光标移动到文件的末尾,然后我们来添加几行非常实用的配置。你可以把下面的内容敲进去,或者复制粘贴进去。
|# 让 ls 命令更好用,ll 和 l. 是我自定义的快捷方式 alias ll='ls -l --color=auto' alias l.='ls -d .* --color=auto' alias la='ls -la --color=auto' # 增加命令历史的记录条数,并忽略连续重复的命令 export HISTSIZE=1000 export HISTCONTROL=ignoredups # 设置默认编辑器 export EDITOR=nano # 自定义提示符,显示用户名、主机名、当前目录和git分支 export PS1=“\[\033[01;32m\]\u@\h\[\0
我们来解读一下这些配置的含义:
ls -l这个长长的命令起了个别名ll。以后你只需输入ll,就相当于输入了ls -l,非常方便。l.也是同理,用于查看隐藏文件。HISTSIZE(历史记录条数)从默认的500增加到1000,并设置HISTCONTROL来避免记录那些你连续输入的重复命令,让你的命令历史更加清爽。你可能注意到了,我们添加的内容里有以#开头的行。在Shell脚本和配置文件里,#是注释符,它后面的内容会被Shell忽略。
写注释是一个极好的习惯,它可以帮你或者其他人理解你当初为什么这么设置。也许今天你觉得这些配置很简单,但半年后回来看,这些“笔记”可能会帮你迅速回忆起一切。
修改完.bashrc文件后,按Ctrl+O保存,然后按Ctrl+X退出nano。但是,这些改动并不会立刻在当前的Shell窗口生效,因为它只在启动时读取一次配置文件。
难道我们必须关闭窗口再重开一个吗?不必!我们可以用source命令,让Shell立刻重新加载一次配置文件:
|$ source ~/.bashrc
或者使用更简短的语法:
|$ . ~/.bashrc
现在,试试你新创建的ll命令吧!是不是感觉Shell变得更听话了?
在使用Shell脚本时,我们可以根据不同的条件来动态地设置环境变量。这意味着我们可以根据当前的系统环境、用户需求或者其他特定的条件来调整环境变量的值,从而实现更灵活和智能的配置。
例如,我们可以根据操作系统的类型来决定将哪个目录添加到PATH环境变量中。这样做的好处是,无论在什么样的环境下运行脚本,它都能自动适应并做出相应的调整。
|# 根据系统类型设置不同的PATH if [ “$OSTYPE” = “linux-gnu” ]; then export PATH=$PATH:/usr/local/bin else export PATH=$PATH:/opt/local/bin fi
在使用Shell时,我们可以通过在.bashrc文件中定义函数来增强Shell的功能。
通过这些自定义函数,我们可以将常用的命令组合在一起,或者创建一些新的命令来简化日常操作。
例如,你可以定义一个函数来快速切换到某个工作目录,或者查看系统的详细信息。这样一来,每次需要执行这些操作时,你只需调用这个函数,而不必重复输入复杂的命令。
|# 创建一个快速进入项目目录的函数 function cdproject() { cd ~/projects/$1 } # 创建一个查看系统信息的函数 function sysinfo() { echo “系统信息:” uname -a echo “内存使用:” free -h echo “磁盘使用:” df -h }
为了确保环境变量在系统重启后依然有效,我们需要将这些变量添加到系统的启动文件中。启动文件是指在每次用户登录或系统启动时自动执行的脚本文件。 通过将环境变量写入这些文件中,我们可以保证它们在每次系统启动时被自动加载,从而在任何时候都能生效。
|# 在~/.bashrc中添加 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export ANDROID_HOME=/opt/android-sdk export PATH=$PATH:$ANDROID_HOME/tools
记住,环境变量的配置是一个持续的过程,随着你的使用经验增加,你会发现更多有用的配置选项。保持学习和实验的态度,你的Shell环境会变得越来越强大和个性化!