wordpress 外贸企业模板seo排名软件怎么做
文章目录
- 第6章 Linux 环境变量
- 6.1 环境变量简介?
- 6.2 全局变量
- 6.3 局部环境变量
- 6.4 设置用户自定义变量
- 6.4.1 设置局部用户自定义变量
- 6.4.2 设置全局环境变量
- 6.4.3 删除环境变量
- 6.5 默认的shell环境变量
- 6.6 设置PATH环境变量
- 6.7 定位系统环境变量
- 6.7.1 登录shell
- 6.7.2 /etc/profile文件
- 6.7.3 $HOME目录下的启动文件
- 6.7.4 交互式shell进程
- 6.7.5 非交互式shell
- 6.8 环境变量持久化
- 6.9 数组变量
第6章 Linux 环境变量
6.1 环境变量简介?
Linux环境变量能帮你提升Linux shell体验。很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。在Linux系统上有很多地方可以设置环境变量,了解去哪里设置相应的环境变量很重要。
本章将带你逐步了解Linux环境变量:它们存储在哪里,怎样使用,以及怎样创建自己的环境变量。最后以数组变量的用法作结。
- bash shell使用环境变量来存储shell会话和工作环境的相关信息(这也是被称作环境变量的原因)。环境变量允许在内存中存储数据,以便shell中运行的程序或脚本能够轻松访问到这些数据。这也是存储持久数据的一种简便方法。
- bash shell中有两种环境变量。
- 全局环境变量:
- 局部环境变量:
6.2 全局变量
全局环境变量对于shell会话和所有生成的子shell都是可见的,这让全局环境变量对那些所创建的子shell需要获取父shell信息的程序来说非常有用。
# 可以使用env命令或printenv命令来查看全局变量:
[root@Fedora-Desktop ~]# env | grep -i PATH
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
[root@Fedora-Desktop ~]# # 显示个别
[root@Fedora-Desktop ~]# printenv PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@Fedora-Desktop ~]# # echo $
也可以使用echo命令显示变量的值。在引用某个环境变量时,必须在该变量名前加上美元符号($):
[root@Fedora-Desktop ~]# echo $HOME
/root
[root@Fedora-Desktop ~]# # 在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令
行参数。
[root@Fedora-Desktop ~]# ls $HOME
anaconda-ks.cfg doc.tar documents music music.tar zy.mp4 zy.txt
[root@Fedora-Desktop ~]#
[root@Fedora-Desktop ~]# ls /root
anaconda-ks.cfg doc.tar documents music music.tar zy.mp4 zy.txt
[root@Fedora-Desktop ~]# # 全局环境变量可用于进程的子shell,用zsh命令生成一个子shell后,显示了HOME环境变量的当前值,这个值和
父shell中的一模一样,都是/home/Chrisine
[root@Fedora-Desktop ~]# zsh
[root@Fedora-Desktop]~# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2185 2170 0 11:12 pts/0 00:00:00 -bash
root 2370 2185 0 11:15 pts/0 00:00:00 zsh
root 2388 2370 0 11:15 pts/0 00:00:00 ps -f
[root@Fedora-Desktop]~# echo $HOME
/root
[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop ~]#
6.3 局部环境变量
局部环境变量只能在定义它的进程中可见。尽管它们是局部的,但是和全局环境变量一样重要 。
Linux系统也默认定义了标准的局部环境变量。不过你也可以定义自己的局部变量,如你所想,这些变量被称为用户定义局部变量。
set
命令可以显示某个特定进程的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量:
[root@Fedora-Desktop ~]# set
······
[root@Fedora-Desktop ~]#
可以看到,所有通过printenv
命令能看到的全局环境变量都出现在了set
命令的输出中。但在set
命令的输出中还有其他一些环境变量,即局部环境变量和用户定义变量。
set命令既会显示全局和局部环境变量、用户自定义变量以及局部shell函数,还会按照字母顺序对结果进行排序。
与set命令不同,env命令和printenv命令既不会对变量进行排序,也不会输出局部环境变量、局部用户自定义变量以及局部shell函数。在这种情况下,env命令和printenv命令的输出是重复的。不过,env命令有printenv命令不具备的一个功能,这使其略胜一筹。
6.4 设置用户自定义变量
可以在bash shell中直接设置自己的变量,也可以在shell脚本程序中创建自己的变量并引用它们。
6.4.1 设置局部用户自定义变量
- 启动bash shell(或者执行shell脚本)之后,就能创建仅对该shell进程可见的局部用户自定义变量。可以使用等号为变量赋值,值可以是数值或字符串。
[root@Fedora-Desktop ~]# echo $my_variable01[root@Fedora-Desktop ~]# my_variable01=123456
[root@Fedora-Desktop ~]# echo $my_variable01
123456
[root@Fedora-Desktop ~]# # 如果用于赋值的字符串包含空格,则必须用单引号或双引号来界定该字符串的起止:
[root@Fedora-Desktop ~]# echo $my_variable02[root@Fedora-Desktop ~]# my_variable02='Hello World'
[root@Fedora-Desktop ~]# echo $my_variable02
Hello World
[root@Fedora-Desktop ~]#
# 注意,你定义的局部变量用的是小写字母,而系统环境变量均用的都是大写字母。
# 在变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,那么bash shell会将值视为单独的命令# 设置好局部变量后,就能在shell进程中随意使用了。但如果又生成了另一个shell,则该变量在子shell中不可用:
[root@Fedora-Desktop ~]# zsh
[root@Fedora-Desktop]~# echo $0
zsh
[root@Fedora-Desktop]~# echo $my_variable02
[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop ~]#
[root@Fedora-Desktop ~]# echo $my_variable02
Hello World
[root@Fedora-Desktop ~]# # 类似地,如果你在子进程中设置了一个局部变量,那么一旦你退出了子进程,那个局部环境变量就不可用。
[root@Fedora-Desktop ~]# zsh
[root@Fedora-Desktop]~# echo $my_child_variable[root@Fedora-Desktop]~# my_child_variable="I an Local now"
[root@Fedora-Desktop]~# echo $my_child_variable
I an Local now
[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop ~]#
[root@Fedora-Desktop ~]# echo $my_child_variable[root@Fedora-Desktop ~]#
# 当我们回到父shell时,子shell中设置的局部变量就不存在了。可以通过将局部的用户定义变量变成全局变量来改变这种情况。
6.4.2 设置全局环境变量
全局环境变量在设置该变量的父进程所创建的子进程中都是可见的。创建全局环境变量的方法是先创建局部变量,然后再将其导出到全局环境中。
# 通过export命令加要导出的变量名
[root@Fedora-Desktop ~]# echo $my_variable03[root@Fedora-Desktop ~]# my_variable03="I am Global now"
[root@Fedora-Desktop ~]# export my_variable03
[root@Fedora-Desktop ~]# echo $my_variable03
I am Global now
[root@Fedora-Desktop ~]# # 子shell中也可见
[root@Fedora-Desktop ~]# zsh
[root@Fedora-Desktop]~# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2185 2170 0 11:12 pts/0 00:00:00 -bash
root 2523 2185 0 11:53 pts/0 00:00:00 zsh
root 2546 2523 99 11:54 pts/0 00:00:00 ps -f
[root@Fedora-Desktop]~#
[root@Fedora-Desktop]~# echo $my_variable03
I am Global now
[root@Fedora-Desktop]~# # 修改子shell中的全局环境变量并不会影响父shell中该变量的值
[root@Fedora-Desktop]~# zsh
[root@Fedora-Desktop]~# my_variable03="NULL"
[root@Fedora-Desktop]~# echo $my_variable03
NULL
[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop]~# echo $my_variable03
I am Global now
[root@Fedora-Desktop]~# # 子shell甚至无法使用export命令改变父shell中全局环境变量的值,尽管子shell重新定义并导出了变量my_variable,但父shell中的my_variable变量依然保
留着原先的值
[root@Fedora-Desktop]~# zsh
[root@Fedora-Desktop]~# my_variable03="NULL"
[root@Fedora-Desktop]~# export my_variable03
[root@Fedora-Desktop]~# echo $my_variable03
NULL
[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop]~#
[root@Fedora-Desktop]~# echo $my_variable03
I am Global now
[root@Fedora-Desktop]~#
6.4.3 删除环境变量
1. unset 删除环境变量
[root@Fedora-Desktop ~]# echo $my_variable04[root@Fedora-Desktop ~]#
[root@Fedora-Desktop ~]# my_variable04="I want delete"
[root@Fedora-Desktop ~]# echo $my_variable04
I want delete
[root@Fedora-Desktop ~]# unset my_variable04
[root@Fedora-Desktop ~]# echo $my_variable04[root@Fedora-Desktop ~]# # 窍门: 如果要用到(doing anything with)变量,就使用$;如果要操作(doing anything to)变量,则不使用$。这条规则的一个例外是使用printenv显示某个变量的值。# 子进程中删除了一个全局环境变量,那么该操作仅对子进程有效。该全局环境变量在父进程中依然可用。
[root@Fedora-Desktop ~]# echo $my_variable05[root@Fedora-Desktop ~]# my_variable05="I am Global now"
[root@Fedora-Desktop ~]# export my_variable05
[root@Fedora-Desktop ~]# zsh
[root@Fedora-Desktop]~# echo $my_variable05
I am Global now
[root@Fedora-Desktop]~# unset my_variable05
[root@Fedora-Desktop]~# echo $my_variable05[root@Fedora-Desktop]~# exit
[root@Fedora-Desktop ~]# echo $my_variable05
I am Global now
[root@Fedora-Desktop ~]#
# 和修改变量一样,在子shell中删除全局变量后,你无法将效果反映到父shell中
6.5 默认的shell环境变量
在默认情况下,bash shell会用一些特定的环境变量来定义系统环境。这些变量在你的Linux系统中都已设置好,只管放心使用就行了。
bash shell源自当初的Unix Bourne shell,因此也保留了Unix Bourne shell里定义的那些环境变量。
bash shell支持的Bourme变量
变量 | 描述 |
---|---|
CDPATH | 冒号分隔的目录列表,作为cd命令的搜索路径 |
HOME | 当前用户的主目录 |
IFS | shell用来将文本字符串分割成字段的一系列字符 |
当前用户收件箱的文件名( bash shell会检查这个文件,看看有没有新邮件) | |
MAILPATH | 冒号分隔的当前用户收件箱的文件名列表( bash shell会检查列表中的每个文件,看看有没有新邮件) |
OPTARG | getopts命令处理的最后一个选项参数值 |
OPTIND | getopts命令处理的最后一个选项参数的索引号 |
PATH | shell查找命令的目录列表,由冒号分隔 |
PS1 | shell命令行界面的主提示符 |
PS2 | hell命令行界面的次提示符 |
bash shell环境变量
变量 | 描述 |
---|---|
BASH | 当前shell实例的全路径名 |
BASH_ALIASES | 含有当前已设置别名的关联数组 |
BASH_ARGC | 含有传入子函数或shell脚本的参数总数的数组变量 |
BASH_ARCV | 含有传入子函数或shell脚本的参数的数组变量 |
BASH_CMDS | 关联数组,包含shell执行过的命令的所在位置 |
BASH_COMMAND | shell正在执行的命令或马上就执行的命令 |
BASH_ENV | 设置了的话,每个bash脚本会在运行前先尝试运行该变量定义的启动文件 |
BASH_EXECUTION_STRING | 使用bash -c选项传递过来的命令 |
BASH_LINENO | 含有当前执行的shell函数的源代码行号的数组变量 |
BASH_REMATCH | 只读数组,在使用正则表达式的比较运算符=~进行肯定匹配( positive match)时,包含了匹配到的模式和子模式 |
······· | |
你可能已经注意到,不是所有的默认环境变量都会在运行set命令时列出。尽管这些都是默认环境变量,但并不是每一个都必须有一个值。
6.6 设置PATH环境变量
# 当你在shell CLI中输入一个外部命令,shell必须搜索系统,从中找到对应的程序。PATH环境变量定义了用于查找命令和程序的目录。
[root@Fedora-Desktop ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@Fedora-Desktop ~]# # PATH中的目录之间以冒号分隔。
# 输出中显示共有7个目录,shell会在其中查找命令和程序。如果命令或者程序所在的位置没有包括在PATH变量中,那么在不使用绝对路径的情况下,shell是无法找到的。shell在找不到指定的命令或程序时会产生错误信息:
[root@Fedora-Desktop ~]# start-dfs.sh
bash: start-dfs.sh: 未找到命令...
[root@Fedora-Desktop ~]# # 你可以把新的搜索目录添加到现有的PATH环境变量中,无须从头定义。PATH中各个目录之间以冒号分隔。只需引用原来的PATH值,添加冒号(:),然后再使用绝对路径输入新目录即可。将该目录加入PATH环境变量之后,就可以在虚拟目录结构的任意位置执行这个程序了。
[root@Fedora-Desktop ~]# PATH=$PATH:/home/zy/Desktop/hadoop-3.1.3/sbin
[root@Fedora-Desktop ~]# start-dfs.sh
Starting namenodes on [Fedora-Desktop]
[root@Fedora-Desktop ~]# # 如果希望子shell也能找到你的程序的位置,一定要记得把修改后的PATH环境变量导出。
对PATH变量的修改只能持续到退出或重启系统。这种效果并不能一直持续。在下一节中,你会学到如何永久保持环境变量的修改效果。
6.7 定位系统环境变量
环境变量的作用持久化
当你登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令。这些文件称作启动文件或环境文件。bash进程的启动文件取决于你启动bash shell的方式。
启动bash shell有以下3种方式:
- 登录时作为默认登录shell
- 作为交互式shell,通过生成子shell启动
- 作为运行脚本的非交互式shell
下面几节介绍了bash shell在不同的方式下启动文件。
6.7.1 登录shell
当你登录Linux系统时,bash shell会作为登录shell启动。
登录shell通常会从5个不同的启动文件中读取命令。
1. /etc/profile
2. $HOME/.bash_profile
3. $HOME/.bashrc
4. $HOME/.bash_login
5. $HOME/.profile# /etc/profile文件是系统中默认的bash shell的主启动文件,系统中的每个用户登录时都会执行这个启动文件。# 注意: 要留意的是有些Linux发行版使用了可拆卸式认证模块(pluggable authentication module,PAM)。在这种情况下,PAM文件会在bash shell启动之前被处理,前者中可能会包含环境变量。PAM文件包括/etc/environment文件和$HOME/.pam_environment文件。
另外4个启动文件是针对用户的,位于用户主目录中,可根据个人具体需求定制。下面来仔细看看各个文件。
6.7.2 /etc/profile文件
1. /etc/profile文件是bash shell默认的主启动文件。只要登录Linux系统,bash就会执行/etc/profile启动文件中的命令。不同的Linux发行版在这个文件中放置了不同的命令。
[root@Fedora-Desktop ~]# cat /etc/profile
# /etc/profile# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.pathmunge () {case ":${PATH}:" in*:"$1":*);;*)if [ "$2" = "after" ] ; thenPATH=$PATH:$1elsePATH=$1:$PATHfiesac
}# 每个发行版的/etc/profile文件都有不同的设置和命令。2. 不同发行版的/etc/profile文件都用到了同一个特性: for语句。它用来迭代/etc/profile.d目录下的所有文件。这为Linux系统提供了一个放置特定应用程序启动文件的地方,当用户登录时, shell会执行这些文件。
[root@Fedora-Desktop ~]# ls /etc/profile.d
bash-color-prompt.sh colorls.sh csh.local gawk.sh lang.csh nano-default-editor.sh vte.sh
bash_completion.sh colorxzgrep.csh debuginfod.csh gnome-ssh-askpass.csh lang.sh PackageKit.sh which2.csh
colorgrep.csh colorxzgrep.sh debuginfod.sh gnome-ssh-askpass.sh less.csh sh.local which2.sh
colorgrep.sh colorzgrep.csh flatpak.sh kde.csh less.sh toolbox.sh
colorls.csh colorzgrep.sh gawk.csh kde.sh nano-default-editor.csh vte.csh
[root@Fedora-Desktop ~]# # 有些文件与系统中的特定应用程序有关。大部分应用程序会创建两个启动文件:一个供bash shell使用(扩展名为.sh),另一个供C shell使用(扩展名为.csh)。
6.7.3 $HOME目录下的启动文件
# 其余的启动文件都用于同一个目的:提供用户专属的启动文件来定义该用户所用到的环境变量。
大多数Linux发行版只用这4个启动文件中的一两个。
1. $HOME/.bash_profile
2. $HOME/.bashrc
3. $HOME/.bash_login
4. $HOME/.profile# 注意,这些文件都以点号开头,说明属于隐藏文件(不会出现在一般的ls命令输出中)。因为它们位于用户的$HOME目录下,所以每个用户可以对其编辑并添加自己的环境变量,其中的环境变量会在每次启动bash shell会话时生效。# 注意: Linux发行版在环境文件方面存在的差异非常大。本节所列出的$HOME文件下的那些文件并非每个用户都有。例如,有些用户可能只有一个$HOME/.bash_profile文件。这很正常。# shell会按照下列顺序执行第一个被找到的文件,余下的则被忽略。
1. $HOME/.bash_profile
2. $HOME/.bash_login
3. $HOME/.profile# 你会发现这个列表中并没有$HOME/.bashrc文件。这是因为该文件通常通过其他文件运行。
# 提示 记住,$HOME代表某个用户的主目录,和波浪号(~)的效果一样。Fedora Linux系统中的.bash_profile文件的内容如下:
[root@Fedora-Desktop ~]# cat $HOME/.bash_profile
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# User specific environment and startup programs
[root@Fedora-Desktop ~]# # .bash_profile启动文件会先检查$HOME目录中是不是还有一个名为.bashrc的启动文件。如果有,就先执行该文件中的命令。
6.7.4 交互式shell进程
1. 如果不是在登录系统时启动的bash shell(比如在命令行中输入bash),那么这时的shell称作交互式shell。与登录shell一样,交互式shell提供了命令行提示符供用户输入命令。作为交互式shell启动的bash并不处理/etc/profile文件,只检查用户$HOME目录中的.bashrc文件。
[root@Fedora-Desktop ~]# cat .bashrc
# .bashrc# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
thenPATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
[root@Fedora-Desktop ~]# # .bashrc文件会做两件事:首先,检查/etc目录下的通用bashrc文件;其次,为用户提供一个定制自己的命令别名和私有脚本函数。
6.7.5 非交互式shell
1. 非交互式shell,系统执行shell脚本时用的就是这种shell。不同之处在于它没有命令行提示符。但是,当你在系统中运行脚本时,也许希望能够运行一些特定的启动命令。# 脚本能以不同的方式执行。只有部分执行方式会启动子shell。2. bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,会检查这个环境变量以查看要执行的启动文件名。如果有指定的文件,则shell会执行该文件里的命令,这通常包括shell脚本变量设置。那如果未设置BASH_ENV变量,shell脚本到哪里去获取其环境变量呢?别忘了有些shell脚本是通过启动一个子shell来执行的。子shell会继承父shell的导出变量。如果父shell是登录shell,在/etc/profile文件、/etc/profile.d/*.sh文件和$HOME/.bashrc文件中设置
并导出了变量,那么用于执行脚本的子shell就能继承这些变量。# 任何由父shell设置但未导出的变量都是局部变量,不会被子shell继承。对于那些不启动子shell的脚本,变量已经存在于当前shell中了。就算没有设置BASH_ENV,也可以使用当前shell的局部变量和全局变量。3. 如果变量未设置, echo命令会显示一个空行,然后返回CLI提示符。
6.8 环境变量持久化
对全局环境变量(Linux系统的所有用户都要用到的变量)来说,可能更倾向于将新的或修改过的变量设置放在/etc/profile文件中,但这可不是什么好主意。# 如果升级了所用的发行版,则该文件也会随之更新,这样一来,所有定制过的变量设置可就都没了,最好在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置都放在这个文件中。在大多数发行版中,保存个人用户永久性bash shell变量的最佳地点是$HOME/.bashrc文件。这适用于所有类型的shell进程。但如果设置了BASH_ENV变量,请记住:除非值为$HOME/.bashrc,否则,应该将非交互式shell的用户变量放在别的地方。注意 图形化界面组成部分(比如GUI客户端)的环境变量可能需要在另外一些配置文件中设置,这和设置bash shell环境变量的文件不一样。第5章讲过,alias命令设置无法持久生效。你可以把个人的alias设置放在$HOME/.bashrc启动文件中使其效果永久化。
6.9 数组变量
1. 环境变量的一个很酷的特性是可以作为数组使用。数组是能够存储多个值的变量。这些值既可以单独引用,也可以作为整体引用。
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
[root@Fedora-Desktop ~]# mytest=(zero one two three four)
[root@Fedora-Desktop ~]# echo $mytest
zero
[root@Fedora-Desktop ~]# # 输出指定索引下标的值
[root@Fedora-Desktop ~]# echo ${mytest[2]}
two
[root@Fedora-Desktop ~]# # 通配符 * 全部输出数组
[root@Fedora-Desktop ~]# echo ${mytest[*]}
zero one two three four
[root@Fedora-Desktop ~]# # 更改某个索引的值
[root@Fedora-Desktop ~]# mytest[2]=seven
[root@Fedora-Desktop ~]# echo ${mytest[2]}
seven
[root@Fedora-Desktop ~]# # unset删除数组中的某个值
[root@Fedora-Desktop ~]# unset mytest[2]
[root@Fedora-Desktop ~]# echo ${mytest[2]}[root@Fedora-Desktop ~]# echo ${mytest[*]}
zero one three four
[root@Fedora-Desktop ~]# # unset 删除整个数组
[root@Fedora-Desktop ~]# unset mytest
[root@Fedora-Desktop ~]# echo ${mytest[*]}[root@Fedora-Desktop ~]#