Linux 环境变量

环境变量定义

bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。

在bash shell中,环境变量分为两类:全局环境变量局部环境变量

全局环境变量:

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。这让全局环境变量对那些所创建的子shell需要获取父shell信息的程序来说非常有用。

Linux系统在你开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。

要查看全局变量,可以使用envprintenv命令。

局部环境变量:

局部环境变量只能在定义它们的进程中可见。事实上,Linux系统也默认定义了标准的局部环境变量。不过你也可以定义自己的局部变量,如你所想,这些变量被称为用户定义局部变量。

注意:

全局环境变量仅在本shell会话和其生成的所有子shell可见,在别的shell会话不可见;子shell定义的全局变量在其父shell不可见;

局部环境变量只能在定义它的进程中可见,在其子shell和父shell中均不可见。

设置局部用户定义变量

一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。

$ echo $my_variable

$ my_variable=Hello

$

$ echo $my_variable

Hello

每次引用my_variable 环境变量的值,只要通过$my_variable引用即可。如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。

$ my_variable=Hello World

-bash: World: command not found

$

$ my_variable="Hello World"

$

$ echo $my_variable

Hello World

没有单引号的话,bash shell会以为下一个词是另一个要执行的命令。注意,你定义的局部环境变量用的是小写字母,而到目前为止你所看到的系统环境变量都是大写字母。

记住,变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell就会把值当成一个单独的命令:

$ my_variable = "Hello World"

-bash: my_variable: command not found

$

设置全局环境变量

在设定全局环境变量的进程和所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过export命令来完成,变量名前面不需要加$。

$ my_variable="I am Global now"

$ export my_variable

或者

$ export my_variable="I am Global now"

source filenamesh filename./filename区别

1. 当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。

2. sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,注意:即使filename变量定义使用export 也不会被带回到父shell中。

3. source filename(等价. filename注意“.”号后面还有一个空格):这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。这个命令常用于在filename中使用export定义一组全局环境变量,通过执行该命令,使得全局变量在该shell及将要生成的子shell中均可以用。

删除环境变量

当然,既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用unset命令完成这个操作。在unset命令中引用环境变量时,记住不要使用$。

$ echo $my_variable

I am Global now

$ unset my_variable

$ echo $my_variable

设置 PATH 环境变量

当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。在本书所用的Ubuntu系统中,PATH环境变量的内容是这样的:

$ echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:

/sbin:/bin:/usr/games:/usr/local/games

$

输出中显示了有8个可供shell用来查找命令和程序的目录。PATH中的目录使用冒号分隔。

如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。问题是应用程序放置可执行文件的目录常常不在PATH环境变量所包含的目录中。解决的办法是保证PATH环境变量包含了所有存放应用程序的目录。

可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义。PATH中各个目录之间是用冒号分隔的。你只需引用原来的PATH值,然后再给这个字符串添加新目录就行了。可以参考下面的例子。

$ echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ PATH=$PATH:/home/christine/Scripts

$ echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/christine/Scripts

如果希望子shell也能找到你的程序的位置,一定要记得把修改后的PATH环境变量使用export定义成全局变量。

环境变量如何持久化

现在你已经了解了各种shell进程以及对应的环境文件(参考《Linux命令行与shell脚本编程大全.第3版》6.6 定位系统环境变量),找出永久性环境变量就容易多了。也可以利用这些文件创建自己的永久性全局变量或局部变量。

对全局环境变量来说(Linux系统中所有用户都需要使用的变量),可能更倾向于将新的或修改过的变量设置放在/etc/profile文件中,但这可不是什么好主意。如果你升级了所用的发行版,这个文件也会跟着更新,那你所有定制过的变量设置可就都没有了。

最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程。但如果设置了BASH_ENV变量,那么记住,除非它指向的是$HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。

参考资料:

Linux命令行与shell脚本编程大全.第3版

你可能感兴趣的:(linux,ubuntu,bash,程序人生)