实例分析:Linux 系统 CentOS8 shell 中 set, env, export 区别与使用场景

简介: set , env 和 export 之间的异同,以及使用场景

区别:

命令set,env,export 均在 bash 中执行。
set : 改变 shell 属性和定位参数值; 显示本地变量、当前shell 的变量,包括当前用户变量
exportbash的内建指令;显示和设置环境变量。
VAR=whatever是变量定义的bash语法;
env显示环境变量,显示当前用户变量;本身是一个程序,当env被调用/执行时,实际触发以下过程:

  • 命令env作为一个新的进程被执行

    • env修改环境
    • 调用被用作参数的命令(command),env进程被命令(command)进程取代
      举例:
[arthur@localhost blog]$ env GREP_OPTIONS='-v' grep one test.txt
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
#this is the test file to analyse the difference between env,set and export
line two

上述命令将启动两个新的进程:(i) env 和 (ii) grep (事实上第二个进程会取代第一个进程)。从grep进程的角度来看,命令执行的结果等同于:

$ GREP_OPTIONS='-v' grep one test.txt

然而,如果你在 bash 之外或者不想启动另一个 shell ,可以使用这个习惯用法(例如,当你使用exec()系列函数而不是system()调用时)

场景:

命令grep 使用称为GREP_OPTIONS 的环境变量来设置命令默认选项。

1. 创建测试文件 test.txt
[arthur@localhost blog]$ vi test.txt
[arthur@localhost blog]$ cat test.txt 
#this is the test file to analyse the difference between env,set and export
line one
line two
2. 运行grep 命令
$ grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE.
Example: grep -i 'hello world' menu.h main.c
-v, --invert-match        select non-matching lines
[arthur@localhost blog]$ grep one test.txt 
line one
[arthur@localhost blog]$ grep -v one test.txt  
#this is the test file to analyse the difference between env,set and export
line two
3. 使用环境变量设置选项:
3.1 若不使用export命令,设置环境变量时,该变量将不能被继承
[arthur@localhost blog]$ GREP_OPTIONS='-v'
[arthur@localhost blog]$ grep one test.txt 
line one

可以发现,选项 -v 并没有传递给命令grep
使用场景:当你设置一个变量仅仅是为了供shell使用的时候,你可以用上述变量命名方式。例如,当你仅仅是为了实现以下功能时:for i in *;do, 你并不想使用export $i来设置变量。

3.2 传递变量至特定的命令行环境
[arthur@localhost blog]$ GREP_OPTIONS='-v'  grep one test.txt 
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
#this is the test file to analyse the difference between env,set and export
line two

使用场景: 临时性改变所启动程序的特定实例的环境

3.3 使用export命令使变量可被子程序继承
[arthur@localhost blog]$ export GREP_OPTIONS='-v'
[arthur@localhost blog]$ grep one test.txt 
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
#this is the test file to analyse the difference between env,set and export
line two

使用场景: 为shell 中随后启动的进程设置变量的最常见方法

拓展: #!/usr/bin/env

env 不需要全路径指向一个程序,是因为它使用execvp()函数,这个函数类似shell的工作原理,通过PATH变量来寻找路径,然后,用命令的运行来取代自身。因此,它可以用于找出解释器(如 perl 或者 python)在路径 中的位置。因而经常使用 #!/usr/bin/env interpreter 而不是 #!/usr/bin/interpreter
此外, 通过修改当前路径,可以影响到具体哪个 python 变量的调用,这将会使如下成为可能:

echo -e `#!/usr/bin/bash\n\necho I am an evil interpreter!` > python
chmod a+x ./python
export PATH=.
python

并不会触发 python 的运行,上述代码将输出结果:

I am an evil interpreter!

reference:
[1] what's the difference between set,export, and env and when should I use each ?.stackExchange.

目录
相关文章
|
8月前
|
存储 Ubuntu Linux
VMware-安装CentOS系统教程及安装包
虚拟机相当于是一个独立于你电脑的环境,在这个环境上面,你可以安装Linux、Windows、Ubuntu等各个类型各个版本的系统,在这个系统里面你不用担心有病读等,不用担心文件误删导致系统崩溃。 虚拟机也和正常的电脑系统是一样的,也可以开关机,不用的时候,你关机就可以了,也不会占用你的系统资源,使用起来还是比较方便 这里也有已经做好的CentOS 7系统,下载下来解压后直接用VMware打开就可以使用
1423 69
|
9月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
634 1
|
8月前
|
Ubuntu Linux 索引
Centos 7、Debian及Ubuntu系统中安装和验证tree命令的指南。
通过上述步骤,我们可以在CentOS 7、Debian和Ubuntu系统中安装并验证 `tree`命令。在命令行界面中执行安装命令,然后通过版本检查确认安装成功。这保证了在多个平台上 `tree`命令的一致性和可用性,使得用户无论在哪种Linux发行版上都能使用此工具浏览目录结构。
707 78
|
9月前
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
924 79
|
6月前
|
监控 关系型数据库 MySQL
在CentOS系统中,如何统计哪个进程打开了文件描述符?
利用上述方法,你可以有效地监控和统计CentOS系统中的进程打开的文件描述符数量,以帮助排查错误或优化系统配置。通过组合使用各种工具和命令,可以获得对系统状态和行为的深入了解,进而做出相应的调整和
302 5
|
10月前
|
存储 JavaScript 前端开发
Set中的add()方法和数组的push()方法有什么区别?
Set中的add()方法和数组的push()方法有什么区别?
529 122
|
8月前
|
缓存 监控 Linux
CentOS系统如何查看当前内存容量。
以上方法都不需要特殊软件或者复杂配置即可执行,在CentOS或其他Linux发行版中都适合运行,并且它们各自透露出不同角度对待问题解答方式:从简单快速到深入详尽;从用户态到核心态;从操作层数到硬件层数;满足不同用户需求与偏好。
612 8
|
10月前
|
机器人 Linux
CentOS 7系统中安装特定版本CMake 3.21.2的方法。
到这里,过程已经全部完成。如果你跟随上面的步骤来,那么你现在已经拥有了一个全新的CMake版本在你的CentOS 7系统上了。这个过程就像是你通过一系列仪式,唤醒了一个沉睡已久的古老机器人,它现在完全按照你的意愿来帮你构建和编译软件了。
713 18
|
8月前
|
存储 Linux 数据安全/隐私保护
确定CentOS系统分区表类型(MBR或GPT)
以上方法均能够帮助用户准确地识别出CentOS下连接硬件所应用得具体磁盘标准,并根据实际需求做进一步处理与管理工作。
808 0
|
8月前
|
Ubuntu Linux 云计算
CentOS与Ubuntu:Linux系统的双璧
选择Ubuntu还是CentOS,取决于用户的具体需求,如是否需要图形化界面、对稳定性的要求、软件包管理的偏好以及对商业支持的需求等。两者都是优秀的Linux发行版,只是在设计理念和目标用户群体上有所不同。#深度好文计划#
下一篇
开通oss服务