shell 环境变量

前言

经过前一章FHS的说明后,我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ” 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致!

环境变量

环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。

原理

当我们在执行一个指令的时候,举例来说ls好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!

创建变量

在 Shell 中如何创建一个变量,如何给变量赋值和如何读取变量的值呢?

使用 declare 命令创建一个变量名为 tmp 的变量:

$ declare tmp

其实也可以不用 declare 预声明一个变量,直接即用即创建,这里只是告诉你 declare 的作用,这在创建其它指定类型的变量(如数组)时会用到。

使用 =号赋值运算符,将变量 tmp 赋值为 test。注意,与其他语言不同的是, Shell 中的赋值操作,=两边不可以输入空格,否则会报错。

# 正确的赋值
$ tmp=test

# 错误的赋值
$ tmp = test

读取变量的值,使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值,初学者经常忘记输入):

$ echo $tmp

查看当前终端环境变量

有时,您可能希望将程序安装到计算机的某个位置,但是你希望可以在任意目录下轻松地执行它们,而无需指定它们的确切位置。通过在$PATH中添加一个目录,可以很容易地做到这一点。要查看当前$PATH中的内容,请输入:echo $PATH

添加自定义路径到“ PATH ”环境变量

临时配置

假设我们目前刚好在我们自己linux系统中安装了mysql数据库。当你想运行mysql程序时,你每次都需要在命令行输入长长的指令/usr/local/mysql/bin,但那样很不方便,如何做到像使用系统命令一样执行mysql程序呢?那就要将命令所在路径添加到 PATH 环境变量了。

在前面我们应该注意到 PATH里面的路径是以:作为分割符的,所以我们可以这样添加自定义路径

$ PATH=$PATH:/usr/local/mysql/bin

注意这里一定要使用绝对路径

现在,只需输入脚本的名称,就可以在系统的任何位置执行脚本,而不必在键入时包含完整的路径。但是,如果重新启动计算机或创建一个新的终端实例,会发生什么情况呢? 命令失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell时自动执行上面添加自定义路径到PATH 的命令?

每个用户的 home 目录中有一个 Shell每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。当前我的系统环境使用的 Shell 是 zsh,它的配置文件是 .zshrc,相应的如果使用的 Shell 是 Bash,则配置文件为 .bashrc。它们在 etc下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。Shell 的种类有很多,可以使用cat /etc/shells命令查看当前系统已安装的 Shell。

确定shell的类型

不确定你在运行哪个shell ?如果您正在使用几乎所有常见的Linux发行版,并且没有更改默认设置,那么您可能正在运行Bash。但是您可以用一个简单的命令来确认这一点
echo $SHELL

永久配置

我们可以简单地使用下面命令直接添加内容到 .zshrc 中:

$  echo 'export PATH="/usr/local/opt/libpcap/bin:$PATH"' >> ~/.zshrc

上述命令中 >> 表示将标准输出追加的方式重定向到一个文件中,注意前面用到的 >以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。

对于bash,你只需要添加export PATH=$PATH:/place/with/the/file 到合适的文件中,当你在启动终端时会自动读取当前shell的环境变量. 你可以在几个不同的地方设置变量名, 比如:~/.bash_profile, ~/.bashrc, ~/.profile. 这些文件之间的区别(主要)在于它们何时被shell读取。如果你不知道把它放在哪里,~/.bashrc是一个不错的选择。

如何让环境变量立即生效

前面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的 .zshrc),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用 source 命令来让其立即生效,如:

➜  ~ source ~/.zshrc

参考文档1
参考文档2

你可能感兴趣的:(shell 环境变量)