一,为什么要在shell脚本编程中使用Linux环境变量?
Linux环境变量能提升shell体验,很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息,所以,了解去哪里设置相应的环境变量很重要。
二,什么是环境变量?
环境变量是Linux系统提供的存储工作环境信息的一种特性,在程序及脚本中能进行访问。
环境标量也分为全局环境标量与局部环境标量。
1,全局环境标量
全局环境变量对于shell会话和所有生成的子shell都是可见的。
- 可以使用env或printenv命令进行查看系统中所有全局环境变量。
- 如果要查看个别全局环境变量,可以使用printenv 变量名方式。也可以使用echo $变量名显示某个变量的值。
- 使用**$环境标量名**还能作为其他命令的参数。
2,局部环境变量
局部环境变量只能在定义它们的进程中可见。
- 在Linux系统并没有一个只显示局部环境变量的命令。 set命令会显示为某个特定进程设置的所有环境变量:
3,用户自定义变量
Linux系统允许用户定义被称为用户定义局部变量的变量。
1,设置局部用户定义变量
- 但是这个局部用户变量my_variable在子shell中就不能再用了:
类似地,如果在子进程中设置了一个局部变量,那么一旦退出了子进程,那个局部环境变量就不可用。
那么怎样将这种局部变量设置为父子进程都能使用呢?继续看。
2,设置设置全局环境变量
那就是设置为全局变量,全局环境变量在进程所创建的子进程中都是可见的,方法:先创建一个局部环境变量,然后再通过export 命令把它导出到全局环境中:
- 修改子shell中的全局环境变量并不会影响到父shell中该变量的值。
- 子shell无法使用export命令改变父shell中全局环境变量的值。
三, 删除环境变量
用unset 环境变量名完成环境标量的删除操作:
- 在子进程中删除全局环境变量只对子进程有效,该全局环境变量在父进程中依然可用:
四,默认的 shell 环境变量
默认情况下,bash shell会用一些特定的环境变量来定义系统环境,部分如下:
HOME 当前用户的主目录
MAIL 当前用户收件箱的文件名( bash shell会检查这个文件,看看有没有新邮件)
PATH shell查找命令的目录列表,由冒号分隔
PS1 shell命令行界面的主提示符
BASH 当前shell实例的全路径名
BASH_COMMAND shell正在执行的命令或马上就执行的命令
BASH_SOURCE 含有当前正在执行的shell函数所在源文件名的数组变量
BASH_VERSION 当前运行的bash shell的版本号
BASH_SUBSHELL 当前子shell环境的嵌套级别(初始值是0)
BASHPID 当前bash进程的PID
HOSTNAME 当前主机的名称
HOSTTYPE 当前运行bash shell的机器
LINENO 当前执行的脚本的行号
OLDPWD shell之前的工作目录
PPID bash shell父进程的PID
PWD 当前工作目录
SHELL bash shell的全路径名
SHLVL shell的层级;每次启动一个新bash shell,该值增加1
UID 当前用户的真实用户ID(数字形式)
五,设置 PATH 环境变量
PATH环境变量定义了用于进行命令和程序查找的目录:
- 如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的,解决办法是保证PATH环境变量包含了所有存放应用程序的目录。具体办法是将要搜索的目录手动添加到PATH:
- 对PATH变量的修改不可持续化,只能持续到退出或重启系统,
六,shell的启动方式
登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。bash检查的启动文件取决于你启动bash shell的方式。启动bashshell有3种方式:
1,默认登录shell
这种启动方式会从5个不同的启动文件里读取命令:
/etc/profile
- /etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
其中/etc/bash.bashrc文件包含了系统环境变量:
还涉及到一个目录/etc/profile.d,它Linux系统提供了一个放置特定应用程序启动文件的地方:
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile - $HOME目录下的启动文件,都起着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。
- 它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些文件中的用户环境变量会在每次启动bash shell会话时生效。
2,交互式 shell 进程
非登陆时启动的shell叫交互式shell,它启动时不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。
3,非交互式 shell
系统执行shell脚本时用的就是非交互式shell,它没有命令行提示符。
如果希望在系统上运行脚本时运行一些特定启动的命令,可将它们写入bash shell提供的BASH_ENV环境变量,因为当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。
如果系统没有BASH_ENV,则:
- 如果父shell是登录shell,在/etc/profile、/etc/profile.d/*.sh$HOME/.bashrc文件中设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。
- 不启动子shell的脚本,变量已经存在于当前shell中了。所以就算没有设置BASH_ENV,也可以使用当前shell的局部变量和全局变量。
七,持久化环境变量
了解了各种shell进程以及对应的环境文件,找出永久性环境变量就很容易。也可以利用这些文件创建自己的永久性全局变量或局部变量。
- 可在/etc/profile文件中添加全局环境变量,但版本升级后会失效。
- 在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。
- 将个人用户永久性bash shell变量的添加至$HOME/.bashrc文件。这一点适用于所有类型的shell进程。
需求驱动1:
经过一~七的复习,我记得之前用了这部分知识,实现“通过变量启动指定位置的程序”这一个快捷功能,特别是对于藏得很深的程序,非常有用。
当初因为Ubuntu安装的pycharm pro没有启动图标,按网上的一些方式是过生成图标,但都失败了,就萌生了能不能用这部分知识搞个永久快捷方式。
具体是这样的:
- 方法一:将程序所在目录添加至PATH环境变量,但重启后会失效。
- 方法二:
1,在$HOME/.bashrc文件添加:
内容是我自己写的一个调用pycharm启动脚本的脚本,用于软件启动及简单的操作日志记录。
2,在命令行快捷启动:
确实是打开了pycharm的,关闭软件后,有个操作记录:
八,数组化的环境变量
需求驱动2:
上面提到,我搞了个启动pycharm的快捷方式,但这种东西多了之后也有些记不住具体命令是什么了,怎么搞?想能不能用数组化的环境变量把它们集合到一起,用之前查一下再执行。
1,在$HOME/.bashrc文件添加:
保存退出后记得source一下。
2,查看快捷集合,选择执行:
搞了一下,还真行,数组环境变量是真的爽,哈哈!