You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:23:14