如何为单个命令临时导出所有Shell变量与Bash函数?
问题
有没有简单方法能给单个命令的作用域导出所有Bash变量和函数,类似env VAR=VALUE cmd的用法,但要覆盖所有现有变量与函数?
场景示例
定义变量和函数:
custom_bash_variable=1 custom_bash_func() { echo $1; }
尝试用env "$(declare)" bash -c 'custom_bash_func $custom_bash_variable'执行,期望输出1,但实际报错:
bash: line 1: custom_bash_func: command not found
限制条件:
- 不能用子shell相关方案(已了解)
- 必须保留
bash -c的调用形式 - 直接拼接
bash -c "$(declare); cmd"不可行,会因内容过长触发Bash报错
解决方案
方法1:通过进程替换传递变量与函数定义
利用declare分别导出变量和函数,通过进程替换传递给子shell加载,避免命令行长度限制:
custom_bash_func() { echo $1; } custom_bash_variable=1 bash -c 'source /dev/stdin; custom_bash_func $custom_bash_variable' < <(declare -p; declare -f)
说明
declare -p:输出所有变量的完整定义(包括未导出的)declare -f:输出所有函数的完整定义< <(...):将上述输出作为标准输入传给子shell,子shell通过source /dev/stdin加载所有变量和函数后执行目标命令
方法2:先导出所有函数与变量,再用env传递
Bash支持将函数导出为特殊环境变量,先批量导出所有函数和变量,再执行目标命令:
custom_bash_func() { echo $1; } custom_bash_variable=1 # 批量导出所有函数 for func in $(declare -F | awk '{print $3}'); do export -f "$func" done # 批量导出所有非内部变量(过滤下划线开头的系统变量) export $(compgen -v | grep -v '^_') # 执行目标命令 env bash -c 'custom_bash_func $custom_bash_variable'
说明
export -f:将指定函数导出为环境变量(Bash专属格式)compgen -v:列出当前所有变量,过滤掉内部变量后批量导出- 此时
env会携带所有导出的变量和函数,子shell可直接调用
内容的提问来源于stack exchange,提问作者profPlum
相关产品推荐
相关产品推荐

