如何将多个 bash 脚本正确地相互导入?

Mar*_*ark 3 unix bash shell path

假设我有以下脚本文件:

~/src/setup.sh: :

#!/usr/bin/env bash

dn=$( dirname "$0" )
source "$dn/init/init.sh"
Run Code Online (Sandbox Code Playgroud)

~/src/init/init.sh :

#!/usr/bin/env bash

dn=$( dirname "$0" )
source "$dn/start.sh"

start_servers "param1" "param2"
Run Code Online (Sandbox Code Playgroud)

~/src/init/start.sh :

#!/usr/bin/env bash

start_servers() {
  # ...
  printf "start the servers..."
  # ...
}
Run Code Online (Sandbox Code Playgroud)

采购第二个文件 ( start.sh ) 结果:

$ ./setup.sh
./init/init.sh: line 4: ./start.sh: No such file or directory
./init/init.sh: line 6: start_servers: command not found
Run Code Online (Sandbox Code Playgroud)

由于我从执行setup.sh.,在获取文件后,start.sh似乎也来自,.但我想从其正确的位置获取它。

知道如何修复它吗?提前致谢。

mkl*_*nt0 5

Bash 具有内置$BASH_SOURCE变量,它类似于$0,但是 - 与后者不同 - 即使在source时,它也能正确反映正在运行的脚本的名称。

因此,简单地替换脚本中的$0with$BASH_SOURCE就足够了。