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

目录
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
24天前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
52 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
7天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
29天前
|
Shell 应用服务中间件 网络安全
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
29天前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
20 0
|
1月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
37 0
|
弹性计算 Linux 数据安全/隐私保护
【ECS常见问题】Linux 实例使用问题
如何查询 Linux 实例的账号和密码? 云服务器 ECS 的账号和密码会在创建成功后发送到您账号绑定的手机和邮箱。Linux 系统的默认管理员账号是 root。
【ECS常见问题】Linux 实例使用问题
|
12天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
104 5
|
12天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
48 4