我的bash脚本中嵌套的`source`命令?

时间:2015-10-28 19:46:09

标签: bash

我有以下设置

└── modules
    ├── main.sh
    ├── major.sh
    ├── sub-modules
    │   └── minor.sh
  • 我已将/modules的路径添加到$ PATH。

all.sh:

source major.sh

major.sh:

source sub-module/minor.sh

但是当我跑步时,我得到了:

-bash: /sub-module/minor.sh: No such file or directory

3 个答案:

答案 0 :(得分:4)

是。这就是. / source运算符的工作方式。

来自spec

  

shell应该从当前环境中的文件执行命令。

     

如果文件不包含<斜杠>,则shell应使用 PATH 指定的搜索路径来查找包含 file 的目录。但是,与普通命令搜索不同, dot 实用程序搜索的文件无需执行。如果未找到可读文件,则非交互式shell将中止;交互式shell应将诊断消息写入标准错误,但不应将此条件视为语法错误。

因此,当您使用source file.sh时,$PATH中的shell会进行搜索,但当您使用source dir/file.sh时,会跳过$PATH次查找,并假设dir为相对于当前目录。

要执行此类操作(在main.shmajor.sh内部),您可以使用Can a Bash script tell what directory it's stored in?来查找要使用的相应绝对路径。

对于一般用途,您需要将它们全部放在绝对/等的$PATHsource中。路径。

答案 1 :(得分:2)

路径查找仅发生在不包含/的名称上。此外,仅检查PATH中目录的直接内容,而不是其所有子目录。使用source sub-module/minor.sh时,sub-module必须位于当前目录中。您还必须在路径中添加/path/to/modules/sub-module,然后单独添加source minor.sh

如果您愿意,可以将其保留为一行:

PATH=/path/to/modules/sub-module:$PATH source minor.sh

这仅为此单PATH命令更新source

答案 2 :(得分:0)

$B -like "*$A*" 中:

all.sh

export ROOT="${BASH_SOURCE%/*}" source "${ROOT}/modules/major.sh" 中:

major.sh

source "${ROOT}/modules/sub-modules/minor.sh" 无需更改即可生效。有关可能的$PATH注意事项,请参见 BashFAQ/028