【Linux | Shell命令】Linux 环境变量

news2024/11/23 20:07:14

目录

  • 一、概述
  • 二、什么是环境变量
    • 2.1 全局环境变量
    • 2.2 局部环境变量
  • 三、设置用户自定义变量
    • 3.1 设置局部用户自定义变量
    • 3.2 设置全局环境变量
    • 3.3 删除环境变量
  • 四、默认的 shell 环境变量
  • 五、
    • 5.1 设置 PATH 环境变量
    • 5.2


在这里插入图片描述

一、概述

Linux 系统中,很多程序和脚本通过环境变量来获取系统信息、存储临时数据和配置信息,了解去哪里设置相应的环境变量很重要。
本文总结了Linux 环境变量:它们存储在哪里、如何使用,以及如何创建自己的环境变量,最后会以数组变量的用法作结。

在这里插入图片描述

在这里插入图片描述

二、什么是环境变量

环境变量允许在内存中存储数据,以便 shell 中运行的程序或脚本能够轻松访问到这些数据。这也是存储持久数据的一种简便方法。bash shell 中有两种环境变量:

  • 全局变量
  • 局部变量

2.1 全局环境变量

全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。局部环境变量则只对创建它的 shell 可见。如果程序创建的子 shell 需要获取父 shell 信息,那么全局环境变量就能派上用场了。
系统环境变量基本上会使用全大写字母,以区别于用户自定义的环境变量。可以使用 env 命令或 printenv 命令来查看全局变量:

>wkd@ubuntu:~$ printenv
XDG_SESSION_ID=4
SHELL=/bin/bash
TERM=xterm-256color
SSH_CLIENT=192.168.2.100 2132 22
SSH_TTY=/dev/pts/10
USER=wkd
JRE_HOME=/opt/jvm/jdk1.8.0_271/jre
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
MAIL=/var/mail/wkd
QT_QPA_PLATFORMTHEME=appmenu-qt5
PWD=/home/wkd
JAVA_HOME=/opt/jvm/jdk1.8.0_271
LANG=en_US.UTF-8
HOME=/home/wkd
SHLVL=2
UNITY_PANEL_TRAY_DISABLE=
LOGNAME=wkd
CLASSPATH=.:/opt/jvm/jdk1.8.0_271/lib:/opt/jvm/jdk1.8.0_271/jre/lib
LESSOPEN=| /usr/bin/lesspipe %s
XDG_RUNTIME_DIR=/run/user/1000
LESSCLOSE=/usr/bin/lesspipe %s %s
OLDPWD=/home/lu
_=/usr/bin/printenv
wkd@ubuntu:~$ 

printenv命令可以显示指定的环境变量的值:

wkd@ubuntu:~$ printenv HOME
/home/wkd
wkd@ubuntu:~$ 

echo 命令也可以显示变量的值。在引用某个环境变量时,必须在该变量名前加上美元符号($):

wkd@ubuntu:~$ echo $HOME
/home/wkd
wkd@ubuntu:~$ 

2.2 局部环境变量

局部环境变量只能在定义它的进程中可见。set 命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量,下面演示set命令使用,由于输出太多,使用grep过滤,只显示带HOME的环境变量:

wkd@ubuntu:~$ set | grep HOME
HOME=/home/wkd
JAVA_HOME=/opt/jvm/jdk1.8.0_271
JRE_HOME=/opt/jvm/jdk1.8.0_271/jre
wkd@ubuntu:~$ 

在这里插入图片描述

三、设置用户自定义变量

3.1 设置局部用户自定义变量

启动 bash shell(或者执行 shell 脚本)之后,就能创建仅对该 shell 进程可见的局部用户自定义变量。格式是:变量名=变量值,值可以是数值或字符串。读取变量值需要使用美元符号$
下面的交互式shell的演示:

wkd@ubuntu:~$ my_var=1234a
wkd@ubuntu:~$ echo $my_var
1234a
wkd@ubuntu:~$ 

如果用于赋值的字符串包含空格,则必须用单引号双引号来界定该字符串的起止:

wkd@ubuntu:~$ my_var="hello world"
wkd@ubuntu:~$ echo $my_var        
hello world
wkd@ubuntu:~$ 

如果没有引号,则 bash shell 会将下一个单词①( World)视为另一个要执行的命令。
注意,你定义的局部变量用的是小写字母,而系统环境变量用的都是大写字母。在变量名、等号和值之间没有空格。

局部变量可以通过set命令看到,而通过envprintenv 命令无法看到:

wkd@ubuntu:~$ set | grep my_var
my_var='hello world'
wkd@ubuntu:~$ env | grep my_var   
wkd@ubuntu:~$ printenv | grep my_var

3.2 设置全局环境变量

全局环境变量在设置该变量的父进程所创建的子进程中都是可见的。
创建方法:先创建局部变量,然后再使用export导出到全局环境中。
用前面的 my_var 变量举例,前面设置成局部变量 ,用env命令看不到,如果导出到全局环境中,env 命令就可以查看了:

wkd@ubuntu:~$ export my_var
wkd@ubuntu:~$ env | grep my_var     
my_var=hello world
wkd@ubuntu:~$ 

在现实中设置全局变量,常设置变量和导出变量放在同一语句,如:export my_var="hello world"

全部变量在子shell中可见,但子 shell 无法修改父 shell 中全局环境变量的值,见如下例子:
在这里插入图片描述

3.3 删除环境变量

在环境变量名(没有加$)前加上unset,可以删除该环境变量:
在这里插入图片描述
和修改变量一样,在子 shell 中删除全局变量后,无法将效果反映到父 shell 中。

在这里插入图片描述

四、默认的 shell 环境变量

在默认情况下, bash shell 会用一些特定的环境变量来定义系统环境。

这些变量在你的 Linux系统中都已设置好,只管放心使用就行了。由于 bash shell 源自最初的 Unix Bourne shell,因此也保留了 Unix Bourne shell 中定义的那些环境变量。

下表列出了 bash shell 与 Unix Bourne shell 兼容的环境变量:

变量描述
CDPATH以冒号分隔的目录列表,作为 cd 命令的搜索路径
HOME当前用户的主目录
IFSshell 用来将文本字符串分割成字段的若干字符
MAIL当前用户收件箱的文件名( bash shell 会检查这个文件来确认有没有新邮件)
MAILPATH以冒号分隔的当前用户收件箱的文件名列表( bash shell 会检查列表中的每个文件来确认有没有新邮件)
OPTARG由 getopt 命令处理的最后一个选项参数
OPTIND由 getopt 命令处理的最后一个选项参数的索引
PATHshell 查找命令时使用的目录列表,以冒号分隔
PS1shell 命令行的主提示符
PS2shell 命令行的次提示符

除了默认的 Bourne 环境变量, bash shell 还提供一些自有的变量,不是所有的默认环境变量都会在 set 命令的输出中列出。如果用不到,默认环境变量并不要求必须有值:

变量描述
BASHbash shell 当前实例的完整路径名
BASH_ALIASES关联数组,包含当前已设置的别名
BASH_ARGC数组变量,包含传入函数或 shell 脚本的参数个数
BASH_ARCV数组变量,包含传入函数或 shell 脚本的参数
BASH_ARCV0包含 shell 的名称或 shell 脚本的名称(如果在脚本中使用的话)
BASH_CMDS关联数组,包含 shell 已执行过的命令的位置
BASH_COMMAND正在执行或将要执行的 shell 命令
BASH_COMPAT指定 shell 兼容级别的值
BASH_ENV如果设置的话, bash 脚本会在运行前先尝试运行该变量定义的启动文件
BASH_EXECUTION_STRING使用 bash 命令的-c 选项传递过来的命令
BASH_LINENO数组变量,包含当前正在执行的 shell 函数在源文件中的行号
BASH_LOADABLE_PATH以冒号分隔的目录列表, shell 会在其中查找可动态装载的内建命令
BASH_REMATCH只读数组变量,在使用正则表达式的比较运算符=~进行肯定匹配( positive match)时,包含整个模式及子模式所匹配到的内容
BASH_SOURCE数组变量,包含当前正在执行的 shell 函数所在的源文件名
BASH_SUBSHELL当前子 shell 环境的嵌套级别(初始值是 0)
BASH_VERSINFO数组变量,包含 bash shell 当前实例的主版本号和次版本号
BASH_VERSIONbash shell 当前实例的版本号
BASH_XTRACEFD如果设置为有效的文件描述符( 0、 1、 2),则’set -x’调试选项生成的跟踪输出可被重定向。通常用于将跟踪信息输出到文件中
BASHOPTS当前启用的 bash shell 选项
BASHPID当前 bash 进程的 PID
CHILD_MAX设置 shell 能够记住的已退出子进程状态的数量
COLUMNSbash shell 当前实例所用的终端显示宽度
COMP_CWORD变量 COMP_WORDS 的索引,其中包含当前光标的位置
COMP_LINE当前命令行
COMP_POINT相对于当前命令起始处的光标位置索引
COMP_KEY用来调用 shell 函数补全功能的最后一个按键
COMP_TYPE一个整数值,指明了用以完成 shell 函数补全所尝试的补全类型
COMP_WORDBREAKSReadline 库中用于单词补全的分隔符
COMP_WORDS数组变量,包含当前命令行所有单词
COMPREPLY数组变量,包含由 shell 函数生成的可能的补全代码
COPROC数组变量,包含用于匿名协程 I/O 的文件描述符
DIRSTACK数组变量,包含目录栈的当前内容
EMACS设置为’t’时,表明 emacs shell 缓冲区正在工作,行编辑功能被禁止
EPOCHREALTIME包含自 Unix 纪元时( 1970 年 1 月 1 日 00:00:00 UTC)以来的秒数,包括微秒
EPOCHSECONDS包含自 Unix 纪元时( 1970 年 1 月 1 日 00:00:00 UTC)以来的秒数,不包括微秒
ENV如果设置,则会在 bash shell 脚本运行之前先执行已定义的启动文件(仅当 bash shell 以 POSIX 模式被调用时)
EUID当前用户的有效用户 ID(数字形式)
EXECIGNORE以冒号分隔的过滤器列表,在使用 PATH 搜索命令时,用于决定要忽略的可执行文件(比如共享库文件)
FCEDIT供 fc 命令使用的默认编辑器
FIGNORE在进行文件名补全时可以忽略后缀名列表,以冒号分隔
FUNCNAME当前正在执行的 shell 函数的名称
FUNCNEST当设置成非 0 值时,表示所允许的函数最大嵌套级数(一旦超出,当前命令即被终止)
GLOBIGNORE以冒号分隔的模式列表,定义了在进行文件名扩展时可以忽略的一组文件名
GROUPS数组变量,包含当前用户的属组
histchars控制历史记录扩展,最多可有 3 个字符
HISTCMD当前命令在历史记录中的编号
HISTCONTROL控制哪些命令留在历史记录列表中
HISTFILE保存 shell 历史记录的文件名(默认是.bash_history)
HISTFILESIZE历史记录文件( history file)能保存的最大命令数量
HISTIGNORE以冒号分隔的模式列表,用于决定忽略历史文件中的哪些命令
HISTSIZE能写入历史记录列表( history list)的最大命令数量
HISTTIMEFORMAT如果设置且不为空,则作为格式化字符串,用于打印 bash 历史记录中命令的时间戳
HOSTFILEshell 在补全主机名时读取的文件名
HOSTNAME当前主机的名称
HOSTTYPE字符串,用于描述当前运行 bash shell 的机器
IGNOREEOFshell 在退出前必须连续接收到的 EOF 字符数量(如果该值不存在,则默认为 1)
INPUTRCReadline 的初始化文件名(默认为.inputrc)
INSIDE_EMACS仅当进程在 Emacs 编辑器的缓冲区中运行时才设置,并且可以禁用行编辑(行编辑的禁用也取决于 TERM 变量的值)
LANGshell 的语言环境种类( locale category)
LC_ALL定义语言环境种类,能够覆盖 LANG 变量
LC_COLLATE设置字符串排序时采用排序规则
LC_CTYPE决定如何解释出现在文件名扩展和模式匹配中的字符
LC_MESSAGES决定在解释前面带有$的双引号字符串时采用的语言环境设置
LC_NUMERIC决定格式化数字时采用的语言环境设置
LC_TIME决定格式化日期和时间时采用的语言环境设置
LINENO当前正在执行的脚本语句的行号
LINES定义了终端上可见的行数
MACHTYPE用“CPU–公司–系统”( CPU-company-system)格式定义的系统类型
MAILCHECKshell 应该多久检查一次新邮件(以秒为单位,默认为 60 秒)
MAPFILE数组变量,当未指定数组变量作为参数时,其中保存了 mapfile 所读入的文本
OLDPWDshell 先前使用的工作目录
OPTERR如果设置为 1,则 bash shell 会显示 getopts 命令产生的错误
OSTYPE定义了 shell 所在的操作系统
PIPESTATUS数组变量,包含前台进程的退出状态
POSIXLY_CORRECT如果设置的话, bash 会以 POSIX 模式启动
PPIDbash shell 父进程的 PID
PROMPT_COMMAND如果设置的话,在显示命令行主提示符之前执行该命令
PROMPT_DIRTRIM用来定义使用提示符字符串\w 和\W 转义时显示的拖尾( trailing)目录名的数量(使用一组英文句点替换被删除的目录名)
PS0如果设置的话,指定了在输入命令之后、执行命令之前由交互式 shell 显示的内容
PS3select 命令的提示符
PS4在命令行之前显示的提示符(如果使用了 bash 的-x 选项的话)
PWD当前工作目录
RANDOM返回一个 0~ 32 767 的随机数(对该变量的赋值可作为随机数生成器的种子)
READLINE_LINE当使用 bind –x 命令时,保存 Readline 缓冲区的内容
READLINE_POINT当使用 bind –x 命令时,指明了 Readline 缓冲区内容插入点的当前位置
REPLYread 命令的默认变量
SECONDS自 shell 启动到现在的秒数(对其赋值会重置计数器)
SHELLbash shell 的完整路径名
SHELLOPTS以冒号分隔的已启用的 bash shell 选项
SHLVLshell 的层级,每启动一个新的 bash shell,该值增加 1
TIMEFORMAT指定了 shell 的时间显示格式
TMOUTselect 命令和 read 命令在无输入的情况下等待多久(以秒为单位,默认值为 0,表示一直等待)
TMPDIR目录名,保存 bash shell 创建的临时文件
UID当前用户的真实用户 ID(数字形式)

在这里插入图片描述

五、

5.1 设置 PATH 环境变量

PATH 环境变量定义了用于查找命令和程序的目录。当外部命令或程序所在的位置包含在 PATH 变量中,那么不不使用绝对路径,shell 也可以找到该路径,否则,会报错command not found
下面是Ubuntu 系统的PATH环境变量的值,目录之间以冒号分隔:

wkd@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

PATH环境变量新增一个路径,只需引用原来的 PATH 值,添加冒号(:),然后再使用绝对路径输入新目录即可,如:PATH=$PATH:/home/wkd/cmd
对于 PATH 变量的修改只能持续到退出或重启系统。下一节会介绍如何永久保持环境变量的改动。

5.2

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爱创科技携腾讯云拓展海内外药械数字溯源服务,“一物一码”全程可追踪

想象一下,当每个人从医院取药窗口或药房买到关乎自己生命健康的药品时,只需掏出手机打开微信,扫一扫药盒上的二维码,就可以看到药品真伪、出厂厂家、用药科普等信息,既带来一份用药的安心,也能清晰地看到医…

二进制、十进制相互转换

二进制转十进制: 1100 0000转为十进制的数值为:12864192 十进制转二进制: 列如:十进制数为202 1286432168421二进制11001010 解析: 202>128,第一个二进制数为:1 202-128>64&#xf…

服务器垃圾怎样清理?C盘垃圾如何清理?

好多人都在问电脑垃圾如何清理?服务器的垃圾清理是系统维护中必不可少的一项任务,而C盘垃圾的清理同样也是必须要做的任务之一。那么,如何一键清理服务器垃圾,C盘垃圾如何清理呢?今天,我会以服务器助手为例…

8、架构:服务端介绍

作为一个产品化的项目,就必然有服务端的支持,这次的项目我们依然使用与上一本小册一样的技术栈 NestJS作为产品的服务端开发语言。 服务端的内容对于常规的前端开发会比较难上手,因为除了服务端的开发语言之外,我们还需要安装各种…

如何查看docker File!!!!

1.如何查看dockerfile! 先docker images 查看所有的镜像,然后再一个目录下先创建一个脚本,把下面内容复制进去 #!/bin/bash export PATH$PATH if [ $# -eq 1 ];thendocker history --format {{.CreatedBy}} --no-trunctrue $1 |sed "s…

基于PyQt5的桌面图像调试仿真平台开发(6)去马赛克

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

c++ connect函数连接失败 解决方法

bool Connect() {//初始化网络WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);if (0 ! WSAStartup(MAKEWORD(2, 2), &wsadata))return false;if (LOBYTE(wsadata.wVersion) ! 2 ||HIBYTE(wsadata.wVersion) ! 2) {printf("请求协议版本失败!\n");ret…

12.JavaWeb-Node.js+创建Vue项目

1.Node.js的概念 传统的Web服务器中,每个请求都会创建一个线程,这会导致线程数的增加,从而影响服务器的性能和扩展性,Ryan Dahl借助Chrome的V8引擎提供的能力实现了Node.js——可以在服务端运行的JavaScript(可以把Nod…

SQL-每日一题【197.上升的温度】

题目 表: Weather 编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。 返回结果 不要求顺序 。 查询结果格式如下例。 示例 1: 解题思路 前置知识 交叉连接(CROSS JOIN) 即笛卡尔积&…

Vue Router 的params和query传参的使用和区别

//$router : 是路由操作对象,只写对象 //$route : 路由信息对象,只读对象//操作 路由跳转 this.$router.push({name:hello,params:{name:word,age:11} })//读取 路由参数接收 this.name this.$route.params.name; this.age this.$route.params.age; 1…

ADS笔记,时域和频域绘图

为防止遗忘,记录一下ADS的时间域和频谱图的绘制 在ADS中想得到电路的时域和频域图的话,可以用谐波平衡仿真HB或者选择一个准瞬态仿真控制器插入到原理图中来实现。 目录 方法一:谐波平衡仿真HB时域设置频域设置 方法二:准瞬态仿…

【Linux】git三板斧教程(免密提交配置)

git 什么是git?Linux下安装git基于git的一些商业网站介绍在gitee上创建仓库注册账号创建项目将仓库克隆到本地 git三板斧git三板斧第一招:git add三板斧第二招:git commit三板斧第三招:git push git免密码提交git log查看提交日志…

通俗易懂的期权入门知识汇总,硅铁期权即将上市适合用那种期权策略管理风险

【1】期权:是指某一标的物的买卖权或选择权。具有在某一限定时期内按某一指定的价格买进或卖出某一特定商品或合约的权利。这种权利是买进者拥有的一种权利,并非一种义务 【2】保证金:为确保执行,期权卖方存入的担保金 【3】多头…

Python flask入门教程(flask教程)(轻量级Web框架)

文章目录 flask能做什么?1. 路由和视图函数2. 模板引擎3. 表单处理4. 数据库集成5. 用户认证和授权6. 文件上传和下载7. RESTful API开发拓展:什么是RESTful API开发 8. 扩展性9. 轻量级和灵活性总结 flask入门1. 安装Flask2. 创建Flask应用3. 定义路由和…

深入理解MySQL事务和@Transactional注解:相似之处与作用解析

前言: 今天碰到几个面试人把Transactional注解,和mysql事务搞混,刻意来一篇讲一下这两者的区别,拒绝死记防止新人面试尴尬 先从简单介绍开始 MySQL事务 MySQL事务是数据库管理系统提供的一种机制,用于执行一组数据库操作,这些操作要么全部成功提交&a…

weblogic系列所有漏洞复现弱口令、CVE-2023-21839、CVE-2018-2894、CVE-2017-10271

文章目录 weblogic介绍:所用工具: weblogic弱口令漏洞详情:复现: Weblogic未授权远程代码执行漏洞 (CVE-2023-21839):漏洞详情:复现: Weblogic任意文件上传CVE-2018-2894漏洞描述:复现: 提提神Weblogic反序列化漏洞&am…

详解SystemVerilog中time slot的调度

1. 前言 本文讲一下SystemVerilog的time slot里的regions以及events的调度。SystemVerilog语言是根据离散事件执行模型定义的,由events驱动。SystemVerilog描述是由连接的执行thread或processes组成。Process是可衡量的,也具有状态,并且可以…

Java中操作文件(二)

目录 一、什么是数据流 二、InputStream概述 2.1、方法 2.2、说明 三、FileInputStream概述 3.1、构造方法 3.2、利用Scanner进行字符串读取,简化操作 四、OutputStream概述 4.1、方法 4.2、PrinterWriter简化写操作 五、小程序练习 示例1 示例…

3D渲染的最佳CPU推荐, 目前流行的 3D 渲染 CPU

在 3D 渲染领域,选择合适的 CPU 对于确保最佳性能和生产力至关重要。CPU 充当渲染工作站的动力源,处理复杂的计算并高效执行渲染任务。市场上有众多选择,了解 2023 年最流行的 3D 渲染 CPU 非常重要。 AMD 锐龙 9 5950X AMD Ryzen 9 5950X …

r‘./csv‘和f‘./csv‘有啥区别

r./csv 和 f./csv 在文件路径中具有不同的含义和用途。 r./csv:这是使用原始字符串(raw string)表示法来表示文件路径。在原始字符串中,反斜杠字符(\)不会被视为转义字符,而是作为普通字符。因…