Linux环境变量在shell下继承

问题:在不同的账户终端上或者子shell使用变量,思考变量的有效范围,并查阅环境变量是如何在不同的shell下继承的?

1. 变量的有效范围

变量在 shell 中的有效范围主要分为两种:局部变量环境变量

  • 局部变量

    • 只在定义它的当前 shell 或子 shell 中有效。
    • 例如,使用 var=value 定义的变量是局部的,无法在子 shell 或其他终端中访问。
  • 环境变量

    • 可以被子 shell 和其他进程继承。

    • 通过 export 命令可以将局部变量转换为环境变量,例如:

      var=value
      export var

  • 现在,var 在当前 shell 及其所有子 shell 中都可用。

2. Shell 变量的作用域示例

  • 局部变量示例

    在当前 shell 中定义一个局部变量

    my_var="Hello"
    echo $my_var # 输出 Hello

    启动一个子 shell

    (
    echo my_var # 仍然输出 Hello my_var="World" # 在子 shell 中修改 echo my_var # 输出 World
    )

    返回到父 shell,my_var 仍然是 Hello

    echo $my_var # 输出 Hello

环境变量示例

复制代码
# 在当前 shell 中定义并导出环境变量
my_env_var="Hello"
export my_env_var

# 启动一个子 shell
( 
  echo $my_env_var  # 输出 Hello
  my_env_var="World"  # 修改环境变量
  echo $my_env_var  # 输出 World
)

# 返回到父 shell
echo $my_env_var  # 仍然输出 Hello,因为父 shell 的环境变量未被修改

3. 环境变量的继承机制

当启动新的 shell 时,环境变量会被继承。具体流程如下:

  • 登录 Shell :当你通过登录(例如 SSH 或打开一个终端)进入系统时,系统会读取 /etc/profile 或用户主目录下的 ~/.bash_profile 等配置文件,这些文件中定义的环境变量会被设置为当前 shell 的环境变量。

  • 非登录 Shell :当你在一个已经打开的 shell 中启动新的 shell(例如通过输入 bashsh)时,该新 shell 会继承当前 shell 的所有环境变量。

  • 子 Shell:无论是通过脚本还是在命令行中创建子 shell,环境变量都会被传递给子 shell。

  • 环境变量与局部变量的区别

    • 环境变量是从父进程传递给子进程的,而局部变量只在当前 shell 会话中可用,不会传递给子进程。

4. 查阅和管理环境变量

  • 查看环境变量 :使用 printenvenv 命令可以列出当前所有的环境变量

  • 查看特定变量 :可以使用 echo 命令查看特定变量的值:

    echo $MY_ENV_VAR

  • 删除环境变量 :可以使用 unset 命令删除某个变量:

    复制代码
    unset MY_ENV_VAR

总结

  • 变量的有效范围在当前 shell、子 shell 和进程之间是不同的。局部变量只能在定义它的 shell 中使用,而环境变量可以在子 shell 和新进程中访问。
  • 环境变量的设置和继承机制确保了在不同 shell 会话中变量的传递,理解这些概念对于脚本编写和系统管理至关重要。
相关推荐
KoiHeng11 分钟前
操作系统简要知识
linux·笔记
Johny_Zhao4 小时前
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
linux·网络安全·docker·信息安全·zookeeper·kubernetes·云计算·系统运维
小毛驴8504 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
一心0925 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上5 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊6 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
tan180°6 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
代码老y6 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程7 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
wuk9987 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github