实例分析: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.

目录
相关文章
|
12月前
|
Unix Linux 编译器
windows下和linux下cmake的规则有区别吗
通过合理使用CMake的条件逻辑和平台特定的配置选项,开发者可以编写更加灵活和健壮的CMake脚本,确保项目在Windows和Linux上的一致性和可移植性。
588 76
|
Linux
linux syscall和int 80的区别
通过以上内容,希望您能更清晰地理解 `int 0x80` 和 `syscall` 的区别及其在不同系统架构中的应用。
953 99
|
7月前
|
存储 Ubuntu 安全
Linux中Centos和Ubuntu的区别
CentOS主要面向服务器环境,而Ubuntu适用于服务器和桌面环境。   CentOS提供更精简的安装,而Ubuntu提供更广泛的开箱即用功能。   CentOS遵循RHEL的所有安全实践,而Ubuntu在安全方面采取更积极的方法。
|
7月前
|
Ubuntu 安全 Unix
Linux和Ubuntu有什么区别
综上所述,Linux和Ubuntu之间存在明显的区别。Linux是一种操作系统内核,而Ubuntu是基于Linux内核的发行版本,具有更好的易用性、社区支持和软件仓库。用户可以根据自己的需求选择不同的Linux发行版本,如果需要一个稳定、易于使用的桌面环境,Ubuntu是一个不错的选择。如果需要更加灵活和定制性强的系统,其他Linux发行版本可能更加适合。
|
8月前
|
安全 Unix Java
linux中kill -9和kill -15区别
在 Linux/Unix 系统中,`kill -9` 和 `kill -15` 是终止进程的常用命令,核心区别在于发送的信号类型不同,导致进程终止行为截然不同。`kill -15`(SIGTERM)允许进程进行清理操作后优雅退出,适用于正常关闭;而 `kill -9`(SIGKILL)则强制终止进程,不给予任何清理机会,仅在进程无响应时使用。本文从信号类型、行为、工作原理及使用建议等方面进行详细对比,帮助你更安全、有效地管理进程。
1169 0
|
11月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1320 25
|
10月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
299 4
|
10月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
547 3
|
11月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
252 18
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
1483 25