如何正确地将多个bash脚本相互发送?

时间:2016-12-15 21:40:21

标签: bash shell unix path

我们说我有以下脚本文件:

〜/ SRC / setup.sh:

#!/usr/bin/env bash

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

〜/ SRC / INIT / init.sh

#!/usr/bin/env bash

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

start_servers "param1" "param2"

〜/ SRC / INIT / start.sh

#!/usr/bin/env bash

start_servers() {
  # ...
  printf "start the servers..."
  # ...
}

获取第二个文件( 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

由于我从.执行 setup.sh ,因此在获取文件后, start.sh 似乎来自.好吧,但我想从适当的位置采购它。

知道怎么解决吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

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

因此,只需在脚本中用$0替换$BASH_SOURCE即可。

答案 1 :(得分:-2)

如果您使用sh而不是source,它将按预期加载环境,而不是在同一环境中执行脚本:

dn=$( dirname "$0" )
sh "$dn/init/init.sh"

此更改将导致代码在子shell中运行,而不是在同一个shell中运行。对于需要外壳函数的脚本,您将无法执行此操作,因为您仍需要获取该函数才能访问该函数。但在你的情况下,唯一需要的脚本仍然可以获取,因为那里你不需要0美元。