能否在另一脚本中source指定脚本设置环境变量并调用deactivate函数?
问题根源
你直接执行./other_program.sh时,系统会启动独立的子Shell进程运行该脚本,所有source操作、变量修改、deactivate函数调用都仅在子Shell的私有环境中生效。脚本运行结束后子Shell退出,所有变更都会被销毁,完全不会影响到父Shell(即你当前的终端/调用环境)的变量设置。
可行解决方案
方案1:用
source命令执行other_program.shsource命令会在当前Shell进程中直接执行脚本内容,所有环境变更都会直接作用到当前环境,操作命令如下:source ./other_program.sh # 或使用简写形式 . ./other_program.sh方案2:通过输出命令+eval实现间接修改
如果你需要将other_program.sh作为普通命令执行、同时要修改当前环境,可以调整脚本内容为执行逻辑后输出需要执行的变量设置命令,再在当前环境用eval解析执行:
修改后的other_program.sh代码:#!/bin/bash source /source/script deactivate # 输出最终需要设置的环境变量命令 echo "export env_var=$env_var"当前环境调用命令:
eval "$(./other_program.sh)"
附加优化:修正原deactivate函数逻辑
你当前写的deactivate函数存在边界问题:如果原来的env_var本身是未定义状态,old_env_var会是空值,执行unset $old_env_var相当于执行无参数的unset会触发报错,建议调整为:
deactivate () { # 判断old_env_var是否被设置过 if [ -n "${old_env_var+set}" ]; then export env_var="$old_env_var" else # 原变量未定义就直接删除当前的env_var unset env_var fi unset old_env_var }
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

