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 会话中变量的传递,理解这些概念对于脚本编写和系统管理至关重要。
相关推荐
o不ok!3 分钟前
Linux面试问题-软件测试
linux·运维·服务器
DaxiaLeeSuper23 分钟前
Prometheus+Grafana+node_exporter监控linux服务器资源的方案
linux·grafana·prometheus
尽兴-2 小时前
如何将多个.sql文件合并成一个:Windows和Linux/Mac详细指南
linux·数据库·windows·sql·macos
kfepiza2 小时前
Netplan 中 bridges、bonds、ethernets、vlans 之间的关系 笔记250711
linux·tcp/ip·shell
小小不董2 小时前
深入理解oracle ADG和RAC
linux·服务器·数据库·oracle·dba
狄加山6753 小时前
Cadence模块复用
服务器·硬件架构·硬件工程·信号处理·智能硬件
宇钶宇夕3 小时前
SIMATIC S7-1200的以太网通信能力:协议与资源详细解析
运维·服务器·数据库·程序人生·自动化
该用户已不存在3 小时前
关于我把Mac Mini托管到机房,后续来了,还有更多玩法
服务器·前端·mac
杰夫贾维斯3 小时前
CentOS Linux 8 的系统部署 Qwen2.5-7B -Instruct-AWQ
linux·运维·人工智能·机器学习·centos