从脚本调用run_sw时如何保留其实际所在目录路径
解决方法
问题根源是用source(.命令)调用run_sw时,$0指向的是当前shell进程名(或你的my_script路径),而非run_sw本身,导致ls -l $0拿不到run_sw的正确信息,最终DIR计算错误。
给你几个不用修改run_sw的解决办法:
方案1:定位绝对路径后切换目录再source
先找到run_sw的绝对路径,切换到它所在的目录再执行source,这样run_sw里的路径计算逻辑就能正常工作:
# 获取run_sw的绝对路径 RUN_SW_ABS=$(realpath run_sw) # 切换到该脚本所在目录 cd "$(dirname "$RUN_SW_ABS")" # 执行source . "$RUN_SW_ABS" # 如果需要回到原来的工作目录,可以先保存原路径 # ORIG_PWD=$(pwd) # cd "$(dirname "$RUN_SW_ABS")" # . "$RUN_SW_ABS" # cd "$ORIG_PWD"
方案2:直接用绝对路径执行脚本(无需source场景)
如果run_sw不需要修改当前shell的环境变量,只是启动程序,直接用绝对路径执行就行:
RUN_SW_ABS=$(realpath run_sw) "$RUN_SW_ABS"
方案3:强制指定$0的值(必须source的场景)
如果必须用source且不想切换目录,可以通过bash的参数强制让$0指向run_sw的绝对路径:
RUN_SW_ABS=$(realpath run_sw) bash -c '. "$0"' "$RUN_SW_ABS"
这样run_sw里的$0就会是它自己的路径,ls -l $0能正确获取到脚本信息,DIR变量就和直接在终端运行时一致了。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

