You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否列出命令行显式设置的Bash变量及脚本调用时的特定变量?

1. 怎么列出命令行里显式设置的bash变量?

bash本身没有专门的命令只挑出你手动在命令行设置的变量,但咱们可以用几个小方法实现:

  • 对比初始环境和当前状态
    刚启动bash的时候,先把初始的变量列表存下来:

    set > initial_vars.txt
    

    等你设置完各种变量后,再把当前的变量列表导出:

    set > current_vars.txt
    

    然后用diff initial_vars.txt current_vars.txt就能看到新增的变量,这些就是你显式设置的。如果只想看环境变量,把set换成env就行。

  • 过滤默认变量
    set命令会列出所有shell变量(包括bash自带的默认变量),我们可以用compgen -v先列出所有变量名,再过滤掉那些系统自带的默认变量:

    compgen -v | grep -v -E '^(BASH|HOME|PATH|USER|SHELL|TERM|PWD|OLDPWD|BASH_VERSION|SHLVL|_)$'
    

    这个命令输出的就是你自己显式设置的变量啦,当然你可以根据自己的系统调整过滤的默认变量列表。

2. 如何提取调用脚本时临时设置的变量(只留var1和x,排除y和z)?

先给你拆解下这条调用命令的逻辑:

  • y=hi:这是父shell里的普通变量,不会传给foo.sh,脚本里根本看不到它
  • z=hello export z:先设置z再导出成环境变量,会被foo.sh继承,属于父shell传递过来的环境变量
  • var1=7 x=a:这是临时绑定给foo.sh进程的环境变量,只在脚本运行时生效,父shell不会保留这些变量

bash没有内置功能直接标记这些临时变量,但我们可以通过对比父进程和脚本进程的环境变量来找出它们:

具体步骤:

  1. 先在父shell里保存当前的环境变量列表:
    env > parent_env.txt
    
  2. 修改调用命令,把这个文件路径作为参数传给脚本:
    y=hi z=hello export z var1=7 x=a ./foo.sh arg1 arg2 parent_env.txt
    
  3. 在foo.sh里写对比逻辑:
    #!/bin/bash
    # 获取传入的父环境变量文件路径
    parent_env_file="$3"
    
    # 提取父环境变量的变量名并排序
    parent_vars=$(cut -d= -f1 "$parent_env_file" | sort)
    # 提取当前脚本进程的环境变量名并排序
    current_vars=$(env | cut -d= -f1 | sort)
    
    # 找出只在当前脚本进程存在的变量(也就是临时设置的)
    temp_vars=$(comm -13 <(echo "$parent_vars") <(echo "$current_vars"))
    
    echo "调用时临时显式设置的变量:$temp_vars"
    

运行脚本后,输出就会是var1 x,完全符合你的需求~

内容的提问来源于stack exchange,提问作者bitmask

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:24:00