Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境变量。
一、概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量分类
- 按照生命周期:
- 永久:需要用户修改相关的配置文件(
/etc/profile
),变量永久生效。 - 临时:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
- 永久:需要用户修改相关的配置文件(
- 按照作用域:
- 系统环境变量:对该系统中所有用户都有效。
- 用户环境变量:只对特定的用户有效。
- 按照生命周期:
常见环境变量
- PATH:指定命令的搜索路径。
- HOME:指定用户的主工作目录,即用户登录后默认的目录。
- HISTSIZE:保存历史命令记录的条数。
- LOGNAME:当前用户的登录名。
- HOSTNAME:主机的名称。
- SHELL:当前用户使用shell。
- LANG/LANGUGE:当前使用的语言。
- MAIL:当前用户的邮件存放目录。
环境变量相关命令
- env:显示所有环境变量
- set:显示本地定义的shell变量
- echo:显示某个环境变量值
echo $PATH
- export:设置一个新的环境变量
export HELLO=hello
- unset:清除环境变量
unset HELLO
- readonly:设置只读环境变量
readonly HELLO
二、PATH相关
一些文件及作用
/etc/profile
:登录环境设置文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时该文件被执行,并从/etc/profile.d
目录配置文件中搜集shell的设置。/etc/bashrc
: 非登录环境设置文件,为每一个运行bash shell
的用户执行此文件,当bash shell
被打开时该文件被读取。~/.bash_profile
: 登录环境设置文件,每个用户都可使用该文件输入专用于自己使用的shell
信息,当用户登录时该文件仅仅执行一次。默认情况下会设置一些环境变量,执行用户的.bashrc
文件。~/.bashrc
:非登录环境设置文件,该文件包含专用于你的bash shell
的bash
信息,当登录时以及每次打开新的shell
时该该文件被读取。~/.bash_logout
:当每次退出bash shell时执行该文件。
一些对比
profile
用于登录式shell
,bashrc
用于每个交互式shell
。~/.bash_profile
是交互式login
方式进入bash
时运行的,~/.bashrc
是交互式non-login
方式进入bash
时运行的。- 二者设置大致相同,通常前者会调用后者,所以一般优先把变量设置在
.bashrc
里面。 - 比如在crontab里面执行一个命令,
.bashrc
设置的环境变量会生效,而.bash_profile
不会。
- 二者设置大致相同,通常前者会调用后者,所以一般优先把变量设置在
login shell
:当你通过终端输入用户名和密码,然后进入到terminal
,这时候进入的shell环境就叫做是login shell
,例如通过ssh远程进入到主机。
no-login shell
:不需要输入用户名密码而进入的shell环境,如通过桌面环境进入,在应用管理器中找到termianl
图标,然后双击打开终端,此时no-login shell
,也可为调用子shell
。
在
MacOS
系统中,每次运行termianl的时候系统都会默认运行一个login shell
环境,所以在MacOS
系统中~/
目录下只有一个.bash_profile
文件而没有.bashrc
文件。
- 设置PATH
- 永久设置(需要重启,可以使用
source
使其立即生效)- 修改
/etc/profile
,对所有用户生效 - 修改
~/.bash_profile
,对当前用户生效
- 修改
- 临时设置
export $PATH=$PATH:/usr/local/your_path/bin
- 永久设置(需要重启,可以使用
/usr/bin
下面的都是系统预装的可执行程序,它会随着系统升级而改变。/usr/local/bin
目录是给用户放置自己的可执行程序的地方,不会因系统升级而被覆盖。
usr
指Unix System Resource
,而不是User
。
$PATH
优先级:越靠前优先级越高,即某个可执行文件同时在/usr/local/bin
和/usr/bin
下,$PATH
为/usr/local/bin:/usr/bin
,则当检测到/usr/local/bin
时找到此文件即中止了,直接执行此文件。