目录
本文内容同微信公众号【凡登】,关注不迷路,学习上高速,欢迎关注共同学习。
在《shell变量类型》中介绍了HOME、$$ 等常用的预定义变量,他们在系统启动后就可以被使用,那么它们在哪里存储呢?在《shell变量作用范围》中介绍了通过在/etc/bashrc配置变量实现跨进程,跨终端,跨用户。 这个文件是什么? 为什么这个配置文件中的变量可以实现跨进程、终端、用户? 他们是本章将要介绍的重点:环境变量配置文件。
环境变量配置文件主要定义的是对系统操作环境生效的系统默认环境变量,每次登录都会被加载。比如:PATH、HOME等。通常也用来设置一些常用的别名、函数和环境变量。如果要添加或修改环境变量的值,则必须再修改完配置文件后重新注销登录读取环境变量配置文件才能生效,或使用source命令可以使配置文件立即生效。格式: source 配置文件 或 . 配置文件(注意点号) 。
在Linux中,常见的环境变量配置文件有:/etc/profile、/etc/profile.d/*.sh、/etc/bashrc、~/.bash_profile、~/.bashrc等。其中/etc/目录下的配置文件对所有用户生效,家目录(~)下的配置文件只对当前用户生效,下面将详细说明。
配置系统环境,如: PATH、USER等变量,同时还包含一些在用户登录时执行的脚本,这些脚本由/etc/profile启动运行,当用户登录Linux系统时,bash将执行/etc/profile文件中的命令,这些命令帮助用户设置工作环境,然后再将控制权交给用户主目录下的~/.profile文件。当系统给出主提示符($PS1)后,用户就可以开始自己的工作。
/etc/profile.d/目录主要用于存放一些应用程序所需的启动脚本。这些脚本文件通常由应用程序安装,并且在用户登录时由/etc/profile文件调用执行,如用户登录Linux系统或使用su命令切换到另一个用户时,设置用户环境第一个读取的文件就是/etc/profile。在/etc/profile中,会使用一个for循环语句来调用/etc/profile.d/*.sh脚本文件, 使得这些脚本文件所设置的环境变量就和/etc/profile启动时一起被设置起来了。
因此,/etc/profile.d目录中的脚本文件通常用于设置应用程序特定的环境变量和配置,以便在用户登录时正确地初始化和运行这些应用程序
在Shell中,~/.bash_profile文件主要用于配置用户环境变量和启动程序。它只对单一用户有效,位于用户的家目录(~)下(~/.bash_profile),当用户登录(login)时,~/.bash_profile文件会被执行,用于设置环境变量和启动程序。这个文件可以用于配置用户的PATH、HISTSIZE、HISTFILESIZE等环境变量的值。
此外,~/.bash_profile文件还可以包含一些用户专用的bash shell信息。它会在用户登录时由~/.bashrc文件执行。
~/.bashrc文件是bash shell的配置文件,用于定义用户登录后的Shell环境。它存储了用户特定的配置信息,例如自定义别名、环境变量、命令别名、Shell函数等。每个用户都可以在自己的家目录(~)下的~/.bashrc文件中添加自己的配置,以满足其个性化的需求.
/etc/bashrc 是一个全局的 Bash 配置文件,用于定义系统中所有用户的 Bash shell 的默认行为和环境变量。它在用户登录时被执行,为用户的交互式 Bash shell 提供一些全局的设置。
具体来说,/etc/bashrc 文件可以定义全局的环境变量,这些变量将在用户登录后的 Bash shell 中生效。通过在文件中添加 export 语句,可以设置全局的环境变量,例如 PATH、LANG、PS1 等。/etc/bashrc 文件还可以定义全局的别名和函数,供所有用户的 Bash shell 使用。通过在文件中添加 alias 或 function 语句,可以创建全局的别名和函数,以简化命令的输入和执行。
此外,/etc/bashrc 文件还可以配置全局的 Shell 行为,例如设置默认的提示符、设置历史命令记录和历史命令的数量限制、配置自动补全等。它还可以导入其他的配置文件,例如 /etc/profile.d/*.sh 或 /etc/bashrc.local 等。这些文件包含了更具体和个性化的设置,用于扩展和定制系统的全局 Bash 配置。
总的来说,/etc/bashrc 文件的作用是为系统中所有用户的 Bash shell 提供默认的环境变量、别名、函数和行为设置。它可以在用户登录时执行,确保所有用户共享相同的全局配置,并提供一致的 Shell 使用体验。
看到这里是不是似乎有点明白了为什么在《shell变量作用范围》文章中介绍到/etc/bashrc中的变量可以实现共享了。
前面介绍了配置文件的基本信息,下面介绍配置文件加载顺序,也就是系统启动或登录时加载配置文件的顺序,优先加载哪个配置文件? 如果配置文件中有相同的变量会被覆盖?这里需要注意bash登录或新启终端会重新加载配置文件。为了更好理解,在配置文件中添加一些日志。然后通过新启终端来观察日志输出得到配置文件加载的先后顺序
注意此时登录账户为root,只有root编辑/etc目下配置文件的权限。先给每个环境变量配置文件添加日志方便观察;
# /etc/profile 文件添加日志
[root@ ~]# vim /etc/profile
# /etc/profile 文件开头
echo "/etc/profile start $USER"
# /etc/profile 文件结尾
echo "/etc/profile end $USER"
# /etc/profile.d/ 目录下添加 hello.sh文件 ,内容:echo '/etc/profile.d/hello.sh'
[root@ ~]# cd /etc/profile.d/ ; vim hello.sh
echo "/etc/profile.d/hello.sh $USER"
# ~/.bash_profile 文件中添加日志
[root@ ~]# vim ~/.bash_profile
# ~/.bash_profile 文件开头
echo "~/.bash_profile start $USER"
# ~/.bash_profile 文件结尾
echo "~/.bash_profile end $USER"
# ~/.bashrc 文件中添加日志
[root@ ~]# vim ~/.bashrc
# ~/.bashrc 文件开头
echo "~/.bashrc start $USER"
# ~/.bashrc 文件结尾
echo "~/.bashrc end $USER"
# /etc/bashrc 文件中添加日志
[root@ ~]# vim /etc/bashrc
# /etc/bashrc 文件开头
echo "/etc/bashrc start $USER"
# /etc/bashrc 文件结尾
echo "/etc/bashrc end $USER"
新启终端,可以看到日志打印顺序
/etc/profile start root
/etc/profile.d/hello.sh root
/etc/profile end root
~/.bash_profile start root
~/.bashrc start root
/etc/bashrc start root
/etc/bashrc end root
~/.bashrc end root
~/.bash_profile end root
[root@ ~]#
日志加载基本顺序:
添加环境变量时,注意当前的配置文件以及变量在配置文件所在位置,避免加载不到或被其他配置文件中相同变量给覆盖额情况 ,需要注意几个细节:
上述介绍5种环境变量配置文件,他们有什么区别什么场景使用?如何区分?接下来从配置文件加载的方式、是否登录状态、服务的对象(系统用户和普通用户)进行介绍;
当我们对环境变量配置文件进行修改后,配置不会立即生效,可通过3种方式重新加载配置文件使其生效。
# 新增环境变量
[root@ ~]$ vim ~/.bashrc
export name=123456
# 当前终端访问
[root@ ~]# echo "$name, hello"
, hello
# 新启终端访问
[root@ ~]# echo "$name, hello"
123456, hello
# 新增环境变量
[root@ ~]$ vim ~/.bashrc
export NAME=123456
# 立即访问
[root@ ~]$ echo "$NAME, hello"
, hello
# 使用source命令加载配置文件
[root@ ~]$ source ~/.bashrc
# 再次访问
[root@ ~]$ echo "$NAME, hello"
123456, hello
这里演示登录普通用户观察配置文件加载情况
# 切换到joy用户 保持环境
[root@ ~]$ su - joy
# 新增环境变量
[joy@ ~]$ vim ~/.bashrc
export app=123456
# 立即访问
[joy@ ~]$ echo "$app, hello"
, hello
# 重新登录joy用户,加载配置文件
[joy@ ~]$ su - joy
Password:
# 切换用户后可以访问变量
[joy@ ~]$ echo "$app, hello"
123456, hello
好像有点懵, 登录? 那不登录配置文件会被加载?接下来请继续看
登录态表示login shell 和 no login shell, 他们将加载的环境变量配置文件主要在于是否加载/etc/profile、~/.bash_profile。
以下演示登录态加载配置文件区别
# root用户 no login 方式切换用户
[root@ ~]# su root
~/.bashrc start root
/etc/bashrc start root
/etc/profile.d/hello.sh root
/etc/bashrc end root
~/.bashrc end root
no login bash情况下会按照以下顺序加载 3种配置文件: ~/.bashrc > /etc/bashrc > /etc/profile.d/*.sh
注意: /etc/profile 和 bash_profile 配置文件未被加载
# root用户 log方式切换用户
[root@ ~]# su - root
/etc/profile start root
/etc/profile.d/hello.sh root
/etc/profile end root
~/.bash_profile start root
~/.bashrc start root
/etc/bashrc start root
/etc/bashrc end root
~/.bashrc end root
~/.bash_profile end root
此时所有的配置文件均被加载。
总结:login 和 no login 最主要区别在 no login 不会加载 /etc/profile 和 bash_profile 配置文件,为了方便记忆,这里就简称为profile文件。
针对环境变量配置服务的用户对象即普通用户和系统用户,将其分为/etc目录的配置和家目录(~)的配置文件
为了节约篇幅,我们将《第2小节配置文件加载顺序#添加日志》例子中
/etc/profile、/etc/bashrc、/etc/profile.d/*.sh中的$USER全部改为123,
~/.bash_profile、~/.bashrc中的$USER全部改为456,
如下所示:
# /etc/profile 文件添加日志
[root@ ~]# vim /etc/profile
# /etc/profile 文件开头
echo "/etc/profile start 123"
# /etc/profile 文件结尾
echo "/etc/profile end 123"
篇幅有限,省略/etc/bashrc、/etc/profile.d/*.sh配置文件 日志记录
# ~/.bash_profile 文件中添加日志
[root@ ~]# vim ~/.bash_profile
# ~/.bash_profile 文件开头
echo "~/.bash_profile start 456"
# ~/.bash_profile 文件结尾
echo "~/.bash_profile end 456"
# ~/.bashrc 文件中添加日志
[root@ ~]# vim ~/.bashrc
# ~/.bashrc 文件开头
echo "~/.bashrc start 456"
# ~/.bashrc 文件结尾
echo "~/.bashrc end 456"
通过示例演示,使用系统用户root和普通用户joy
# root用户 log方式切换用户
[root@ ~]# su - root
/etc/profile start 123
/etc/profile.d/hello.sh 123
/etc/profile end 123
~/.bash_profile start 456
~/.bashrc start 456
/etc/bashrc start 123
/etc/bashrc end 123
~/.bashrc end 456
~/.bash_profile end 456
可以看到系统用户root下的环境变量配置文件均加载了
# log方式 切换非root用户
[root@ ~]# su - joy
/etc/profile start 123
/etc/profile.d/hello.sh joy
/etc/profile.d/hello.sh 123
/etc/profile end 123
/etc/bashrc start 123
/etc/bashrc end 123
通过对比发现,普通用户joy家目录(~)下的配置文件中没有输出带有456日志。为什么??难道没有加载joy用户家目录(~)下的~/.bashrc和~/.bash_profile环境变量配置文件?
切换joy用户,给~/.bashrc和~/.bash_profile环境变量配置文件添加日志,注意,此时添加的数字为789
# ~/.bash_profile 文件中添加日志
[joy@ ~]# vim ~/.bash_profile
# ~/.bash_profile 文件开头
echo "~/.bash_profile start 789"
# ~/.bash_profile 文件结尾
echo "~/.bash_profile end 789"
# ~/.bashrc 文件中添加日志
[joy@ ~]# vim ~/.bashrc
# ~/.bashrc 文件开头
echo "~/.bashrc start 789"
# ~/.bashrc 文件结尾
echo "~/.bashrc end 789"
再次切换joy用户
[joy@ ~]$ su - joy
/etc/profile start 123
/etc/profile.d/hello.sh joy
/etc/profile.d/hello.sh 123
/etc/profile end 123
~/.bash_profile start 789
~/.bashrc start 789
/etc/bashrc start 123
/etc/bashrc end 123
~/.bashrc end 789
~/.bash_profile end 789
可以看到所有文件均加载了,我们对此下
系统用户家目录(~)环境变量配置文件输出日志都带456,/etc目录下配置文件打印是123,
普通用户家目录(~)环境变量配置文件打印日志都带789,/etc目录下配置文件打印是123,
总结:
系统用户加载在/etc目录下的变量配置文件 /etc/profile、/etc/bashrc、/etc/profile.d/*.sh对所有用户生效。
普通用户加载家目录(~)用户特有的配置文件~/.bash_profile、~/.bashrc,只对当前用户生效。
上述对环境变量配置文件的加载方式、登录态和服务用户三个不同的角度深入的介绍配置文件的特点,从而对配置文件有了更好的把控。
我们知道环境变量配置文件通常也用来设置一些常用的自定义别名、环境变量、命令别名、Shell函数,那么我们是否可以利用这些能力,简化常用命令以提高工作效率?
[root@ ~]# cat ~/.bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
从这里看到对rm、cp、mv命令重新定义为选择交互方式执行,以保证操作更安全。
[root@ ~]# vim ~/.bashrc
# 定义sortn按照数字升序排序
alias sortn='sort -n'
# 定义访问数据库,此处为示例,注明mysql密码,实际工作总不建议明文配置。
alias mydb='mysql -h 127.0.0.1 -ujoy -p123456 user'
# source 使配置立即生效
[root@ ~]# source ~/.bashrc
[root@ ~]# vi data.txt
20
5
3
60
# 使用自定义命令sortn
[root@ ~]# sortn data.txt > result.txt
[root@ ~]# more result.txt
3
5
20
60
以上演示了sort、mysql命令自定义示例,注:定义访问数据库,此处为示例,mysql为明文密码,实际工作总不建议明文配置。读者可结合自己工作常用命令赶紧来试试吧。
上面简单介绍了命令别名,还有其他的函数有兴趣的可以尝试下,这里不做展开。
本章介绍环境变量配置文件的基本概念和5种类型环境变量配置文件(/etc/profile、/etc/profile.d/*.sh、/etc/bashrc、~/.bash_profile、~/.bashrc)、并深入讲解配置文件加载顺序,在这里我们知道配置文件加载属性顺序,有利于我们全局把控定义配置文件和分析解决问题,接着展开描述了配置文件的加载方式、服务用户对象和登录态区分他们使用场景,最后介绍变量配置文件的特性,如可设置别名、函数等,充分利用特性以此扩展来提高工作效率,通过示例演示日常工作中常用的一些小技巧。至此变量相关章节告一段落。
再次感谢您的阅读,欢迎关注微信公众号【凡登】共同学习。
shell变量系列相关的文章回顾: