使用 Linux 环境变量

什么是环境变量

在 bash shell 中,环境变量分为:全局变量、局部变量。

全局环境变量

查看全局变量。

printenvenv

显示某个环境变量的值。

printenc HOME
或
echo $HOME

全局变量可用于进程的所有子shell。

局部环境变量

局部变量只能在定义它们的进程中可见。你可以自定义局部变量。
Linux 中并没有一个只显示局部环境变量的命令。set 命令会显示某个特定进程的所有环境变量,包括局部变量、全局变量以及用户自定义变量。

设置用户定义变量

设置局部用户定义变量

一旦启动了 bash shell 或是 执行一个 shell 脚本,就能创建在这个 shell 或 shell 脚本程序中创建自己的变量,可以通过等号给环境变量赋值,值可以是数值或是字符串。

my_variable=Hello
echo $my_variable

如果值中含有空格,请用双引号引用起来。
自定义的局部变量请用小写字母。
设置好局部环境变量之后,就能在 shell 进程的任何地方使用,但是,如果生成了另外一个shell,它在子 shell 中就不可用,当退出子 shell 到原来的 shell 中时,这个局部环境变量依然可用。

设置全局环境变量

在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法就是创建一个局部环境变量,然后再把它导出到全局变量中。

my_variable="I am Global now"
export my_variable

修改子 shell 中全局环境变量并不会影响到父 shell 中该变量的值。子 shell 无法使用 export 命令改变父 shell 中全局环境变量的值。尽管子 shell 重新定义并导出了变量 my_variable,但父 shell 中的 my_variable 变量依然保留着原先的值。

删除环境变量

echo $my_variable
unset my_variable

如果要用到变量,使用 $,如果要操作变量,不使用 $。

如果你在子进程中删除了一个全局环境变量,这只对子进程有效,该全局变量在父进程中依然可用,在子进程中删除了全局变量后,你无法将结果反映到父 shell 中。

设置 PATH 环境变量

echo $PATH

上述命令能够输出 shell 用来查找命令和程序的路径。

ls 能够正确执行,而不需要输入绝对路径,是因为会查找 $PATH 变量下的路径,如果没有则会报错。

可以把新的搜索目录添加到现有的 PATH 环境变量中,PATH 变量叠加:

PATH="$PATH":/root/sh

对 PATH 变量的修改只能持续到退出或重启系统。这种效果并不能一直持续。

定位系统环境变量

在你登入 Linux 系统启动一个 bash shell 时,默认情况下,bash 会在环境文件中查找命令,而检查什么环境文件和你启动 bash shell 的方式有关,bash shell 有3中启动方式:

  • 登陆时作为默认登录 shell
  • 作为非登录 shell 的交互式 shell
  • 作为运行脚本的非交互式 shell

登录 shell

  • /etc/profile 系统默认的bash shell主启动文件。
    • USER 变量
    • LOGNAME 变量
    • MAIL 变量
    • PATH 变量
    • HOSTNAME 变量
    • HISTSIZE 变量
    • umash
    • 调用 /etc/profile.d/*.sh 文件
  • $HOME/.bash_profile
    • 调用了 $HOME/.bashrc 文件
    • 在 PATH 变量后面加入了 “:$HOME/bin” 这个目录。
  • $HOME/.bashrc
    • 定义默认别名
    • 调用 /etc/bashrc
  • $HOME/.bash_login
    • PS1 变量
    • umask
    • PATH 变量
    • 调用 /etc/profile.d/*.sh 文件
  • $HOME/.profile

配置文件的调用流程:

/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc
命令提示符
/etc/profile.d/*.sh
/etc/profile.d/lang.sh
/etc/sysconfig/i18n

交互式 shell 进程

如果 bash 是作为交互式 shell 启动的,它就不会访问 /etc/profile 文件,只会检查用户 HOME 目录中的 .bashrc 文件。

非交互式 shell

系统执行脚本的时候就是用这种 shell。它没有命令行提示符。

脚本能以不同的方式执行,只有其中的某些方式能够启动子shell。

为了处理这种情况,bash shell 提供了 BASH_ENV 环境变量。当 shell 启动一个非交互式 shell 进程时,它会检查这个环境变量来查看要执行的启动文件,如果有指定文件,shell 会执行该文件里的命令,这通常包括 shell 脚本变量设置。

环境变量持久化

对于全局变量,修改 /etc/profile 文件,不过最好的方式是在 /etc/profile.d 目录中创建一个以.sh结尾的文件,把所有修改过的全局环境变量设置放在这个文件中。
在大多数发行版中,存储个人用户永久性 bash shell 变量的地方是 $HOME/.bashrc 文件。但如果设置了 BASH_ENV 变量,那么记住,除非它指向的是 $HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。

发布了247 篇原创文章 · 获赞 38 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_39541632/article/details/104674756
今日推荐