LINUX环境变量shell和sh执行时的加载顺序
创始人
2024-09-25 15:48:25
0

一、前言

  LINUX是多用户操作系统,针对操作系统用户的一些系统参数值,应用初始化前通常需要进行配置。而LINUX针对这块的设置既有系统级配置文件,又有用户级配置文件。我们在编写脚本或者初始化应用时,了解清楚不同配置文件的加载顺序,有利于更好且有效的设置好我们需要的参数。

  最近,看到一篇很早之前的博主文章,写到这块知识点,并且还配上了图,看完再加上动手实验,相信会对此豁然开朗。话不多说,先上图

图上内容描述是不同调用环境下shell脚本调用的配置文件加载顺序,再上手验证测试之前,还需要了解下几种不同执行方式的区别和基础概念。

二、基础知识点

1、sh和bash

sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。在一般的linux系统当中(如redhat,centos),使用sh调用执行脚本相当于打开了bash的POSIX标准模式(等效于bash的 --posix 参数)一般的,sh是bash的“子集”
bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

在大多数简单脚本中,两种执行没有任何区别,但从上图可以看出不同执行方式的环境变量加载是有区别的。后续测试案例中会验证这一点。

2、login与 no login

登录 shell :是指需要用户名、密码登录后进入的 shell,或者通过 --login 选项生成的 shell 。
非登录 shell :是指不需要输入用户名和密码即可打开的 shell,比如输入命令 bash或者sh 就能进入一个全新的非登录 shell。

sh或者bash执行shell脚本时可添加l参数执行,默认执行脚本是非登录式执行。

3、interactive与non-interactive

交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
非交互式模式,是指以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。

sh或者bash执行shell脚本时可添加i参数执行,默认执行脚本是非交互式执行。

三、相关配置文件

系统级配置文件:

/etc/profile

/etc/bashrc

用户级配置文件:

~/.profile

~/.bash_profile

~/.profile_login

~/.bashrc

~/.bash_logout

注:一般情况下,用户级配置文件默认已没有~/.profile、~/.profile_login文件

当前设定的临时环境变量:

$ENV

$BASH_ENV

四、测试验证

以登录、非登录、交互、非交互,四种不同的维度,验证上图中的配置文件加载顺序及最终执行情况。

前提准备条件:

(1)所以相关配置文件增加同一个alias 命令名,能说明调用的文件,如下所示/etc/profile下添加内容:

alias  mytest="echo This is /etc/profile"。

(2)编辑测试脚本,调用执行配置文件中配置的mytest别名

#!/bin/bash
a=`mytest`
echo  $a

1、bash模式

(1)交互式的登录shell (bash –il test.sh)
载入的信息:
/etc/profile
~/.bash_profile( -> ~/.bashrc -> /etc/bashrc)
~/.bash_login
~/.profile

执行结果:

结论:执行顺序是从上到下,优先级从左到右,~/.bash_login与~/.profile不在,所以此处执行的/.bash_profile配置


(2)非交互式的登录shell (bash –l test.sh)
载入的信息:
/etc/profile
~/.bash_profile ( -> ~/.bashrc -> /etc/bashrc)
~/.bash_login
~/.profile
$BASH_ENV

结论:执行顺序是从上到下,最后是当前环境配置ENV,因为当前环境变量没有这个mytest命令,脚本无法执行。


(3)交互式的非登录shell (bash –i test.sh)
载入的信息:
~/.bashrc ( -> /etc/bashrc)

结论:优先级/.bashrc高于/etc/bashrc


(4)非交互式的非登录shell (bash test.sh)
载入的信息:
$BASH_ENV

结论:载入的当前设置的临时变量,无mytest命令,执行报错。


2、sh模式


(1)交互式的登录shell (sh –il test.sh)
载入的信息:
/etc/profile
~/.profile

结论:执行顺序是从上到下,没有~/.profile配置文件,所以执行的/etc/profile参数设定。


(2)非交互式的登录shell (sh –l test.sh)
载入的信息:
/etc/profile
~/.profile

结论:同交互式的登录shell


(3)交互式的非登录shell (sh –i test.sh)
载入的信息:
$ENV

结论:载入的是当前ENV环境,所以脚本报错


(4)非交互式的非登录shell (sh test.sh)
载入的信息:
nothing

结论:无任何配置加载动作,所以脚本执行报错

相关内容

热门资讯

2分钟细说!wpk德州辅助(软... 2分钟细说!wpk德州辅助(软件透明挂)同城跑胡子有猫腻的(有挂总结)准备好在wepoke ia的高...
4分钟秒懂!微扑克德州辅助(透... 4分钟秒懂!微扑克德州辅助(透视插件)微扑克德州果真真的有挂的(有挂启发)是一款可以让一直输的玩家,...
带你了解!wpk机器人软件(软... 《带你了解!wpk机器人软件(软件透明挂)钱塘十三水有漏洞的(有挂技巧)》 wpk软件透明挂更新公告...
3分钟秒懂!WePOker辅助... 3分钟秒懂!WePOker辅助挂(透视脚本)WePOker果然是有猫腻的(有挂引领);玩家必备必赢加...
揭秘!微扑克ai辅助会封号的(... 揭秘!微扑克ai辅助会封号的(透视)星悦陕西麻将神器(有挂辅导);本章节将是从实际的德州星悦陕西麻将...
五分钟透视!wepOKer是有... 五分钟透视!wepOKer是有透视软件(透视作弊)wepOKer其实真的是有挂的(有挂策略);玩家必...
我来教大家!德州wpk德州真的... 《我来教大家!德州wpk德州真的假的(透明挂)开心十三张辅助挂(有挂途径)》 wpk软件透明挂更新公...
如何把彩色cad转成黑白pdf... 在CAD软件中,将图纸设置为黑白模式,然后选择打印,打印机选择“DWG to PDF”,再在打印设置...
手机文件夹里那些可以删除 手机文件夹中,通常可以删除的是缓存文件、临时文件、下载的应用程序安装包等。但需注意,不要删除系统文件...
梦幻新诛仙手游各个职业加点(梦... 梦幻新诛仙手游中,各职业加点需根据角色定位。如青云注重法术攻击,可主加智力;鬼王宗则偏重物理防御,可...