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 会话中变量的传递,理解这些概念对于脚本编写和系统管理至关重要。
相关推荐
爱装代码的小瓶子4 小时前
Linux下的权限与文件
linux·运维·服务器
ggaofeng5 小时前
linux中mount的本质是什么?自己如何实现一个伪文件系统
linux·mount·自己实现伪文件系统
敲上瘾5 小时前
Linux系统C++开发环境搭建工具(二)—— etcd 使用指南
linux·c++·etcd
励志不掉头发的内向程序员5 小时前
【Linux系列】解码 Linux 内存地图:从虚拟到物理的寻宝之旅
linux·运维·服务器·开发语言·学习
Fuly10245 小时前
使用docker本地部署dify
运维·docker·容器
woshihonghonga6 小时前
停止Conda开机自动运行方法
linux·人工智能·conda
遇见火星9 小时前
Ubuntu Docker 容器化部署教程
linux·ubuntu·docker
ybb_ymm11 小时前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql
半梦半醒*11 小时前
zabbix安装
linux·运维·前端·网络·zabbix
Panda__Panda12 小时前
docker项目打包演示项目(数字排序服务)
运维·javascript·python·docker·容器·c#