Linux变量的认识及环境变量配置详解

文章目录

    • 1、变量的划分
    • 2、局部变量
    • 3、全局变量
    • 4、环境变量
      • 4.1、概述
      • 4.2、配置临时环境变量
      • 4.3、配置永久环境变量
        • 4.3.1、用户级配置文件
          • 1)配置方法一:~/.bashrc文件
          • 2)配置方法二:~/.profile文件
          • 3)配置方法三:~/.bash_profile文件
        • 4.3.2、系统级配置文件
          • 1)配置方法一:/etc/environment文件
          • 2)配置方法二:/etc/profile文件
          • 3)配置方法三:/etc/bashrc文件
        • 4.3.3、/etc/profile.d/配置路径
      • 4.3、查看环境变量
    • 5、内置变量
    • 6、参考

1、变量的划分

在Linux中,变量的划分有很多种,其中根据变量的作用范围(作用域)进行划分的有四类,分别是局部变量、全局变量、环境变量、内置变量。下面来具体讨论,本文以环境变量的讨论为主,其他变量简要说明。

2、局部变量

局部变量,使用local关键字定义的变量,通常在定义它的脚本或命令中可见,但仅在定义的函数中可使用,脚本或命令中的其他函数不可使用,除非被明确传递,在其子脚本或子进程中也不可用。通常在函数中使用关键字local来定义,示例:

function myFunction() {local localVar="a local var"
}

3、全局变量

全局变量,未使用 local 关键字的变量都是全局变量,在定义的脚本及命令中可见,一般在函数外定义,在整个脚本及命令中全局可使用。但在不使用export导出的情况下,无法在子脚本中可见,即切换进程后无法使用:

  • 定义全局变量,示例:
GlobalVar1="A global VAR1"
# 切换用户查看
su other_user
echo $GlobalVar1

image-20240503222755932

切换进程后,无法查看到对应的全局变量,因为没通过export将其导出,无法正常的访问。

  • 定义全局变量,并将其export导出,示例:
export GlobalVar2="A global VAR2"
# 切换用户查看
su other_user
echo $GlobalVar2

image-20240503222740097

切换进程后,能够正常的访问到相应的全局变量,其通过export导出,使其在子脚本或命令中可见,因此能够正常访问到。

注意: 全局变量一般定义为小写字母,当定义为大写字母时,默认其为全局配置,即环境变量,这是一个通用的约定,避免变量的调用冲突。

4、环境变量

4.1、概述

环境变量是在Linux操作系统中用来指定操作系统运行环境的一些参数的一种机制。它们是动态命名的值,通常名称用大写字母进行定义,由操作系统或用户设置。通常情况下会存放重要的配置信息,如配置文件路径、用户信息、网络设置参数等。常见的环境变量有 PATH, HOME, USER 等,下面来详细讨论环境变量的不同配置方法及其作用域。

4.2、配置临时环境变量

使用 export 命令来设置临时环境变量,示例:

export TEST="$TEST:/usr/local/bin"

执行完后通过echo $PATH查看,仅在当前窗口生效,关闭窗口或新建其他窗口,无法查看到之前设置的临时环境变量:

image-20240503225912798

作用范围: 仅当前用户,当前窗口。

注意: 与全局变量中使用export导出变量效果类似,差别在于大小写。

4.3、配置永久环境变量

4.3.1、用户级配置文件

用户级配置文件,作用范围仅为单个用户的账户,只有当该用户登录shell或启用新的shell面板时,配置内容才会生效。提供给不同用户可以灵活配置各自的工作环境,下面是具体的用户配置方法:

1)配置方法一:~/.bashrc文件
vim ~/.bashrc
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
export TEST="$TEST:/usr/local/bin"

适用于当前登录用户,用于非登录 shell,即在用户登录后启动的shell中生效或新的终端窗口或新的shell脚本。

生效方法: 使用source ~/.bashrc生效配置,并重新打开新的终端,即刻生效。

用户范围: 当前用户,新建窗口&刷新变量后的窗口。

2)配置方法二:~/.profile文件
vim ~/.profile
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
export TEST="$TEST:/usr/local/bin"

适用于当前登录用户,登录型shell,即登录过程中进行配置生效。

生效方法: 使用source ~/.profile生效配置,并重新打开新的终端,即刻生效。

用户范围: 当前用户,新建窗口&刷新变量后的窗口。

3)配置方法三:~/.bash_profile文件
vim ~/.bash_profile
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
export TEST="$TEST:/usr/local/bin"

适用于当前登录用户,登录型shell,即登录过程中进行配置生效。与~/.profile作用范围相同,但生效的优先级高于~/.profile文件

生效方法: 使用source ~/.profile生效配置,并重新打开新的终端,即刻生效。

用户范围: 当前用户,新建窗口&刷新变量后的窗口。

4.3.2、系统级配置文件

系统级配置文件,影响范围为整个系统,所有的用户账户,无论是哪一位用户登录均可使用当前配置的系统环境变量内容,作用在提供一套标准的用户环境,保持系统环境一致性。同时系统级配置存在权限控制,仅有管理员可以进行配置,加强了环境管理。下面是不同的系统级配置的方法:

1)配置方法一:/etc/environment文件
vim /etc/environment
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
TEST="$TEST:/usr/local/bin"

这是一个简单的键值对文件,用于设置系统级环境变量。这里设置的变量对所有用户有效。这里由于使用键值对存储,无需使用export关键字。

生效方法: 系统重启,或用户注销重新登录

用户范围: 系统所有用户

2)配置方法二:/etc/profile文件
vim /etc/profile
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
export TEST="$TEST:/usr/local/bin"

这是全系统的登录脚本,当任何用户登录时运行,登录过程中进行配置生效。

生效方法: 系统重启,或用户注销重新登录

用户范围: 系统所有用户

3)配置方法三:/etc/bashrc文件
vim /etc/bashrc
# 内容末行添加环境变量内容:完成后wq保存并关闭文件
export TEST="$TEST:/usr/local/bin"

适用于所有用户的 Bash 配置,用于非登录 shell,即在用户登录后启动的shell中生效或新的终端窗口或新的shell脚本。

生效方法: 系统重启,或用户注销重新登录。针对当前窗口可以使用source /etc/bashrc来生效配置。

用户范围: 系统所有用户

4.3.3、/etc/profile.d/配置路径

在Centos 7.9中,有/etc/profile.d/路径用来存放自定义脚本,这些脚本会在登录时自动运行,可以通过该机制,创建shell脚本来配置环境变量,如setenv.sh

#!/bin/bash
export TEST="$TEST:/usr/local/bin"

之后,赋予该脚本执行权限,即可在每次登录时,使用特定的环境变量:

chmod +x /etc/profile.d/setenv.sh

由于是在系统级路径下进行配置,其实整个过程,也相当于是系统级的一个环境变量配置。这个路径下的脚本,所有用户登录都会执行。

生效方法: 系统重启,或用户注销重新登录

用户范围: 系统所有用户

4.3、查看环境变量

  • 1、printenv 命令

可以打印部分或全部环境变量:

# 打印全部环境变量
printenv
# 打印PATH环境变量
printenv PATH
  • 2、env命令

env 命令类似于 printenv,但通常用于在修改后的环境中运行程序,不带参数时与printenv等价。

# 打印全部环境变量
env
# 在新环境变量中运行程序
env test.sh
  • 3、echo命令

使用 echo 命令可以显示一个特定环境变量的值,可用于快速检查一个变量的修改是否生效:

echo $PATH
  • 4、set命令

set 命令可以显示局部和环境变量以及 shell 函数,其打印的信息比printenv更多,但不推荐使用,因为其包含的内容不只是环境变量,结果会更杂乱。

5、内置变量

由 shell (比如 Bash Shell)本身预定义的变量称之为内置变量,非用户自定义。这些内置变量提供了关于系统环境和 shell 自身运行状态的重要信息,用户无法创建新的内置变量。一般情况下不允许用户修改内置变量,仅可读取,常见的内置变量有下面这些:

内置变量描述
HOME当前用户的主目录路径。
PWD当前工作目录的路径。
USER当前登录的用户名。
BASH_VERSION当前运行的 Bash 版本信息。
PATH系统查找命令的目录列表。
RANDOM每次引用时生成的随机整数。
UID当前用户的用户ID。

使用内置变量示例:

echo "Your home directory is $HOME"
echo "You are logged in as $USER"

6、参考

https://juejin.cn/post/6844904173775880199

https://zhuanlan.zhihu.com/p/566600783

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】——用户和权限管理(二)

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

腾讯地图商业授权说明一篇文章讲清楚如何操作

最近在使用腾讯地图,发现我要上架应用商店APP需要我有地图的授权书。 认真研究了一下原来腾讯地图现在要收费了,如果你打算以商业目的使用它,比如对第三方用户收费或者进行项目投标等,就需要先获取腾讯位置服务的商业授权许可。申…

Apache.commons.lang3 的 isNumber 将会在 lang 4 的时候丢弃

在判断输入的字符串是不是一个数字的时候,我们通常用的最多的方法就是 : NumberUtils.isNumber("12"); 但是这个方法将会在 Lang 4.0 版本中被丢弃。 可以使用的替代方法为:isCreatable(String) 通过查看源代码,我们…

通过helm在k8s上安装minio

1 helm安装minio 1.1 下载minio 添加仓库 helm repo add bitnami https://charts.bitnami.com/bitnami 将minio拉取下来 helm pull bitnami/minio --version 版本号 解压到本地开始编辑配置文件 tar -zxf minio-xxx.tgz [rootk8s-master01 minio]# vi values.yaml 1.2…

【WebGIS实例】(13)MapboxGL 加载地形高程数据

前言 官网示例:Add 3D terrain to a map | Mapbox GL JS | Mapbox 大佬博客:Mapbox GL基础(七):地形数据的处理与加载 (jl1mall.com) 加载Mapbox地形数据 map.once(style.load, () > {map.addSource(mapbox-dem,…

一键修图拯救五一废片!百度搜索推出AI图片助手

「五一」旅游高峰即将来临,不过没有朋友圈的九图照片,假期相当于白过。 但拍照一时爽,修图火葬场。一张自己的美照背后,乱入了不相干的游人,光是去掉这样的背景就要花费大量的时间。 现在,只需要几秒钟&a…

[每日AI·0506]巴菲特谈 AI,李飞飞创业,苹果或将推出 AI 功能,ChatGPT 版搜索引擎

AI 资讯 苹果或将推出 AI 功能,随 iPhone 发布2024 年巴菲特股东大会,巴菲特将 AI 类比为核技术 巴菲特股东大会 5 万字实录消息称 OpenAI 将于 5 月 9 日发布 ChatGPT 版搜索引擎路透社消息,斯坦福大学 AI 领军人物李飞飞打造“空间智能”创…

C#知识|如何在WinForm窗体中实现分割线绘制?

哈喽,你好啊,我是雷工! 在上位机UI设计中经常会用到分割线,用来分割界面区域。 像在KingSCADA、杰控、昆仑通态、WinCC、组态王、力控、易控等组态软件中非常简单,有现成的划线操作,选中相关工具直接绘制即…

C++ 对象数组

定义对象数组、使用对象数组的方法与基本数据类型相似,因为类本质上也是一种数据类型。在定义对象数组时,系统不仅为对象数组分配适合的内存空间,以存放数组中的每个对象,而且还会为每个对象自动调用匹配的构造函数完成数组内每个…

宏电全栈式IoT赋能供排水智能监测,护航城市生命线

城市供水、排水系统是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市的“生命线”。随着城市化进程加快,城市规模不断扩大,地下管线增长迅速,城市“生命线安全”的监管日益面临挑战。 宏电作为物联网行业的领航者…

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤(裸光纤)由运营商提供,是无中继的光纤线路,仅通过配线架连接。相比传统光纤,裸光纤提供纯粹的物理传输路径,无需额外网…

python基础---面向对象相关知识

面向对象 可以把数据以及功能打包为一个整体 类: 名称属性(数据)方法 class Person:def __init__(self, name, age):self.age ageself.name namedef print_info:print(self.name, self.age)定义 #经典类 class Dog1:pass# 新式类 class Dog2(object):pass在python3里面这…