subprocess.check_output中脚本export的变量无法被同子进程后续命令读取
解决子shell导出变量无法被后续命令读取的问题
问题原因
核心问题是shell进程环境隔离:直接运行./foo/s.sh时,脚本会在独立的子shell进程中执行,里面的export VAR_T='foo'仅对这个子shell生效,脚本执行完毕子shell退出后,变量也随之消失。而后续的echo $VAR_T是在启动脚本的父shell里运行,自然读不到子shell内的变量。
两种可行解决方法
方法1:用source(或.)执行脚本,共享当前shell环境
把脚本的执行方式从直接运行改成source(缩写为.),这样脚本会在当前shell进程内执行,导出的变量直接留在当前环境中,后续命令就能读取到。
修改后的代码:
command='. ./foo/s.sh && echo $VAR_T' subprocess.check_output(command, shell=True)
- 用单引号包裹命令字符串,避免Python提前解析
$VAR_T . ./foo/s.sh等价于source ./foo/s.sh,作用是在当前shell中执行脚本内容
方法2:捕获脚本输出传递变量(适合脚本必须独立运行的场景)
如果脚本有其他副作用(比如改变工作目录、执行其他进程),不能在当前shell执行,可以修改./foo/s.sh让它输出变量值,再在父shell中捕获输出赋值给变量:
- 修改
s.sh,在末尾添加输出变量的命令:
# s.sh原有内容 export VAR_T='foo' # 添加此行 echo "$VAR_T"
- 修改Python中的命令:
command='VAR_T=$(./foo/s.sh) && echo $VAR_T' subprocess.check_output(command, shell=True)
这里$(./foo/s.sh)会捕获脚本的输出(即VAR_T的值),赋值给父shell的VAR_T变量,后续echo就能正常输出。
内容的提问来源于stack exchange,提问作者user22437092
相关产品推荐
相关产品推荐

