这是我尝试的简单脚本
#!/bin/bash DIR="$(cd "$(dirname $0)" && pwd)" echo $DIR
当我执行它时$ ./my_script.sh
,正确获取路径。
但是,当我像这样获取它时$ source my_script.sh
,它会获取路径/bin
如何通过源获取脚本的路径?
源代码和执行代码有什么区别?
答案1
获取脚本和“运行它”之间的区别在于,当您获取它(使用source
或.
)时,该脚本将在当前 shell 环境中执行,而如果您“运行它”,则会启动一个新的 shell 进程。您想要源脚本来更改当前的 shell 环境。在单独的 shell 进程中运行的脚本可以不是更改父 shell 的环境。 “环境”是指 shell 和环境变量的值、当前工作目录等。
脚本通常被编写为要么获取源代码要么在其自己的 shell 环境中执行,但很少两者兼而有之。获取源的脚本有时称为“点脚本”(因为 是.
获取此类脚本的标准命令;source
是 的bash
“别名” .
)。
由 shell 获取的点脚本bash
可以通过检查数组的第一个元素来找到其位置BASH_SOURCE
:
printf 'My location: %s\n' "$( dirname "${BASH_SOURCE[0]}" )"
目录路径将相对于调用时source
或.
脚本上的当前工作目录。