能否列出命令行显式设置的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没有内置功能直接标记这些临时变量,但我们可以通过对比父进程和脚本进程的环境变量来找出它们:
具体步骤:
- 先在父shell里保存当前的环境变量列表:
env > parent_env.txt - 修改调用命令,把这个文件路径作为参数传给脚本:
y=hi z=hello export z var1=7 x=a ./foo.sh arg1 arg2 parent_env.txt - 在
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
相关产品推荐
相关产品推荐

