如何从根目录执行Bash脚本时使其如同在自身目录运行?
解决Bash脚本跨目录执行时找不到同目录依赖的问题
有几种可靠的方法能让你从根目录执行folder1/folder2/my-script.sh时,自动以folder2作为工作目录运行:
方法1:切换到脚本所在目录后执行
修改my-script.sh为以下内容:
#!/bin/bash # 获取当前脚本所在的绝对路径 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 切换到脚本目录,切换失败则退出 cd "$SCRIPT_DIR" || exit 1 # 执行同目录下的脚本 ./do-it.sh
${BASH_SOURCE[0]}会返回当前脚本的实际路径(无论从哪里执行)dirname提取路径中的目录部分,再通过cd+pwd得到绝对目录cd "$SCRIPT_DIR" || exit 1确保如果目录切换失败(比如脚本被移动),脚本会立即退出,避免后续错误操作
方法2:直接用绝对路径调用依赖脚本
如果不需要切换工作目录,只是要正确找到do-it.sh,可以直接用脚本目录拼接路径:
#!/bin/bash SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) # 用绝对路径执行依赖脚本 "$SCRIPT_DIR/do-it.sh"
这种方法不会改变当前的工作目录(执行完脚本后你依然在根目录),适合只需要调用单个依赖脚本的场景。
不推荐的方法:写死绝对路径
虽然可以直接在脚本里写死do-it.sh的绝对路径:
#!/bin/bash /folder1/folder2/do-it.sh
但这种方法灵活性极差,一旦脚本目录被移动,就需要手动修改路径,不适合需要移植的场景。
内容的提问来源于stack exchange,提问作者VeryNiceArgumentException
相关产品推荐
相关产品推荐

