为何source命令在脚本与终端中的执行表现存在差异?
问题原因分析
当你在myscript中执行source $1时,source_issue.sh会继承myscript的位置参数——此时$1是source_issue.sh的完整文件路径,$#等于1,因此触发CASE 1分支,直接将文件路径赋值给SCRIPT_LOC,最终导致PLNX指向文件而非脚本所在目录。
而直接在终端source时,没有传递任何参数,$#为0,触发CASE 2分支,通过BASH_SOURCE获取脚本路径并处理为正确的目录。
解决方案(两种可选)
由于无法修改source_issue.sh,我们需要让它在被myscript调用时进入CASE 2分支,核心思路是让source_issue.sh的位置参数为空。
方法一:清空位置参数后再source
修改myscript,先保存当前位置参数,清空后再source目标脚本,最后可选择恢复参数:
#!/bin/bash cd "$(dirname "$0")" # 保存要source的脚本路径 target_script="$1" # 保存原位置参数(可选,若后续无需使用可省略) original_args=("$@") # 清空位置参数,让source_issue.sh的$#为0 set -- # source目标脚本,此时会进入CASE 2 source "$target_script" # 恢复原位置参数(可选) set -- "${original_args[@]}"
方法二:切换到脚本目录后source相对路径
通过切换到source_issue.sh所在目录,再source相对路径的脚本,避免传递参数:
#!/bin/bash cd "$(dirname "$0")" # 获取目标脚本的绝对路径和所在目录 abs_script=$(readlink -f "$1") script_dir=$(dirname "$abs_script") # 切换到脚本所在目录 cd "$script_dir" # source当前目录下的脚本,无参数传入 source "./$(basename "$abs_script")"
验证效果
运行修改后的myscript,会输出:
CASE 2 environment set to '/home/<user>/Work/Experiments/random'
与直接在终端source的结果一致,PLNX将正确指向脚本所在目录。
内容的提问来源于stack exchange,提问作者Douglas B
相关产品推荐
相关产品推荐

