百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

设置与查看Linux系统中的环境变量

bigegpt 2024-08-22 10:37 2 浏览

大家好,我是良许。

大家都知道,在 Linux 系统中,有环境变量Shell 变量这两种变量。

环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用,可以用来存储当前用户的 ID 等信息。

那么什么是环境变量,什么是 Shell 变量,该如何设置和查看这两种变量呢?

接下来,让良许为你解答:

环境变量

环境变量是以键值对的形式实现的,是在整个系统范围内都可用的变量,并由所有派生的子进程和 Shell 继承。而环境变量的名称是区分大小写的,且通常以大写的形式命名 ( MYVAR1, MYVAR2... )

单个值的环境变量看起来是这样的:

KEY=value1

如果你想要将多个值赋予环境变量,则通常用冒号 ( : ) 作为分隔符。每一对键值对最终看起来是这样子的:

KEY=value1:value2:value3

如果要赋予环境变量的值包含空格,则需要使用引号:

KEY="value with spaces"

Shell 变量

Shell 变量是专门用于设置或定义它们的 Shell 中的变量。每个 Shell ,例如 zsh 和 bash ,都有一组自己内部的 Shell 变量。它们通常用于跟踪临时数据,比如当前工作目录,而用法则与环境变量相同。

如果你想让 Shell 变量作为全局变量使用,可以使用 export 指令:

$ export MYVAR=lxlinux.net
$ echo $MYVAR
lxlinux.net
$ env | grep MYVAR
MYVAR=lxlinux.net

常见的环境变量与 Shell 变量

一些环境变量和 Shell 变量是非常有用的,并且经常会被引用。以下是一些常见的,你以后可能会遇到的环境变量:

变量名含义TERM这指定运行 Shell 时要模拟的终端类型。可以针对不同的操作需求模拟不同的硬件终端。不过,你通常不需要管这个变量。USER当前登录的用户PWD当前的工作目录OLDPWD上一个工作目录,这个变量由 Shell 保存,以便通过执行 cd - 切换回上一个工作目录。LS_COLORS这定义了 ls 指令的颜色输出代码,用于向 ls 指令添加颜色输出。这通常用于区分不同的文件类型并使用户对文件类型等信息一目了然。MAIL当前用户邮箱的路径PATH系统在查找指令时会检查的目录列表。当用户输入一个指令时,系统将按此目录列表的顺序检查目录,以寻找相应的可执行文件。LANG当前的语言和本地化设置,包括字符编码。HOME当前用户的主目录_上一个被执行的指令

除了以上这些环境变量,你也可能会经常遇到以下这些 Shell 变量:

变量名含义BASHOPTS执行 bash 时所启用的选项列表,这对于确定 Shell 环境是否按照预期的方式运行很有帮助。BASH_VERSION人类可读格式的正在执行的 bash 版本BASH_VERSINFO机器可读格式的正在执行的 bash 版本COLUMNS用于设置绘制到屏幕上的输出信息的宽的列数DIRSTACKpushdpopd 命令可用的目录堆栈。HISTFILESIZE存储到文件中的命令历史记录的行数。默认为 ~/.bash_history 文件的行数。HISTSIZE内存中允许存储的命令历史记录的行数,即 histroy 命令所能打印出来的行数。HOSTNAME计算机的主机名IFS内部字段分隔符,用于分隔命令行上的输入。 默认以空格作为分隔符。PS1定义主命令提示符。 这用于定义启动 Shell 会话时命令提示符的外观。而 PS2 用于声明跨越多行的命令的命令提示符。SHELLOPTS可以用 set 命令设置的 Shell 选项。UID当前用户的 UID (用户 ID)

查看 Shell 变量与环境变量

在 Linux 系统中,有以下几种命令可以让你查看环境变量:

env — 该命令可以让你在自定义的环境中运行程序,并且不需要改变当前的环境。当不带参数使用 env 命令时,它会打印出当前的环境变量列表。

printenv — 可以打印出所有的或者指定的环境变量。

set — 该命令可以设置或者删除 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

默认状态下,envprintenv 的功能是完全相同的:

$ printenv 
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=alvin
MYVAR=lxlinux.net
PWD=/home/alvin
HOME=/home/alvin
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/alvin
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=alvin
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

只有在更具体的功能上才能体现出 env 命令与 printenv 命令的区别。例如,使用 printenv 命令,你可以请求单个变量的值:

$ printenv SHELL
/bin/bash
$ printenv HOME
/home/alvin
$ printenv MYVAR
lxlinux.net

env 命令可通过将一组变量传递给命令来修改程序运行的环境:

env MYVAR=lxlinux.net command_to_run command_options

printenvenv 命令只能打印出环境变量,而如果你想打印出所有变量或者 Shell 函数的列表,你可以使用 set 指令。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/alvin/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/alvin
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=#39; \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=35
LOGNAME=alvin
.....

该命令将显示一个包含所有变量的大列表,因此你可能会希望将输出传递给 less 命令。

$ set | less

设置 Shell 变量与环境变量

Linux 系统中可以设置环境变量的命令有以下几种:

set — 该命令可以设置或者取消设置 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

unset — 该命令可以删除 Shell 变量以及环境变量。

export — 该命令可以设置环境变量。

为了更好地理解 Shell 变量和环境变量之间的区别,我们先从设置 Shell 变量开始讲,然后再讲环境变量。

先从在当前会话中定义一个 Shell 变量开始:

$ MYVAR=lxlinux

你可以用 echo $MYVAR 来验证变量是否已设置:

$ echo $MYVAR
lxlinux

使用 printenv 命令检验该变量是否为环境变量:

$ printenv MYVAR

没有输出返回,这就意味着 MYVAR 变量并不是环境变量。

export 命令可以用来设置环境变量。要创建环境变量,只需用 export 命令将 Shell 变量导出为环境变量:

$ export MYVAR

你可以用以下语句检验:

$ printenv MYVAR
lxlinux

当然,你也可以只用一行代码来设置环境变量:

$ export MYNEWVAR="My New Variable"

但是以这种方式创建的环境变量只能用于当前会话,如果你打开一个新的 Shell 会话,或者退出登陆,所有的变量都将会丢失。

我们也可以将环境变量还原为 Shell 变量,或者将其完全删除:

MYVAR 变量被定义为环境变量,我们可以通过输入以下代码将其还原为 Shell 变量:

$ export -n MYVAR

这样,MYVAR 变量就不再是环境变量了,但依然还是 Shell 变量。

无论是 Shell 变量还是环境变量,想要完全删除变量,都可以使用 unset 命令来删除:

$ unset MYVAR

可以通过以下语句来验证 MYVAR 变量已经删除:

$ echo $MYVAR

由于变量已经删除了,所以没有任何返回。

环境变量的持久化

许多程序都需要使用环境变量来决定具体的执行方式,但是,我们并不希望每次启动新的 Shell 会话时都必须重新设置重要的变量,因此我们需要将重要的环境变量写入配置文件中。

Shell 会话有不同的启动方式,比如,连接到终端的交互式 Shell 与未连接到终端的非交互式 Shell,还有登录式 Shell 与非登录式 Shell, 而 bash Shell 会根据会话不同的启动方式而读取不同的配置文件。

但是,在大多数 Linux 发行版中,当你启动一个新的 Shell 会话时,一般都会从以下文件中读取环境变量:

/etc/environment — 使用此文件来设置系统范围内可用的环境变量。

/etc/profile — 每当 bash 登录 Shell 时,都会加载此文件中设置的变量。

~/.bashrc — 每个用户特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中声明变量。

如果要将新的环境变量加载到当前的 Shell 会话中,可以使用source命令:

$ source ~/.bashrc

如果你想要设置环境变量,你就可以考虑将其添加到 /etc/profile/etc/bash.bashrc/etc/environment 文件中。

结论

在本文章中,我们了解了一些常见的环境变量和 Shell 变量,也学习了如何设置和查看这些变量,其实这些变量一直都在我们的 Shell 会话中,而且对许多程序都很有用,有很多常见的场景都会引用到这些变量。希望这对你的工作也有帮助。如果你还对这两种变量有任何疑问,请留言告诉我呗!

> 2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书 「**良许Linux**」后台回复「**资料**」免费获取


#### 看完的都是真爱,点个赞再走呗?您的「三连」就是良持续创作的最大动力!

1. 关注**原创**「**良许Linux**」,第一时间获取最新Linux干货!

2. 后台回复【资料】【面试】【简历】获取精选一线大厂面试、自我提升、简历等资料。

3. 关注我的博客:[lxlinux.net](http://www.lxlinux.net)

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...