在Bash中能否设置仅首次访问时执行命令的环境变量?
原生Bash并没有提供直接定义「首次访问才执行命令、结果自动缓存复用」的环境变量的语法,但可以通过以下两种方案实现你要的效果:
方案1:兼容所有Bash版本的最简实现
用Bash内置的${VAR:=default}参数扩展语法即可,这个语法的逻辑是:如果变量VAR未定义或者值为空,就会把default的内容赋值给VAR后返回结果;如果VAR已经有有效值,直接返回现有值。
注意:不要覆盖系统自带的
PWD变量,会影响其他命令的正常运行,我们这里改用ORIG_PWD作为自定义变量名示例。
使用方法如下:
# 每次访问变量时使用这个扩展写法即可 echo ${ORIG_PWD:=$(pwd)}
- 第一次执行时如果
ORIG_PWD为空,会自动执行pwd命令,把结果赋值给ORIG_PWD后返回 - 后续所有访问只要
ORIG_PWD没有被手动修改,都会直接返回第一次缓存的结果 - 如果需要静默初始化变量,可以执行
: ${ORIG_PWD:=$(pwd)},不会有输出,只会完成赋值
方案2:实现直接访问$VAR就自动懒加载(要求Bash 4.3及以上版本)
如果不想每次访问都写扩展语法,要做到直接写$ORIG_PWD就能自动触发懒加载逻辑,可以用Bash的nameref(名称引用)特性实现:
# 先定义懒加载变量的注册函数 lazy_var() { local var_name="$1" exec_cmd="$2" # 生成同名触发函数 eval "$var_name() { unset -f $var_name export $var_name=\"\$($exec_cmd)\" echo \"\$$var_name\" }" # 绑定名称引用,访问变量时自动触发同名函数 declare -n "$var_name"="$var_name" } # 注册你的懒加载变量:变量名ORIG_PWD,首次访问执行pwd命令 lazy_var ORIG_PWD pwd
注册完成后直接访问$ORIG_PWD就会自动触发你要的逻辑:第一次执行pwd存结果,后续复用缓存。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

