2015-10-28 33 views
3

我有以下设置在我的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 

回答

1

是。这是./source运营商的工作原理。

spec

外壳应在当前环境中的文件执行命令。

如果文件不包含<斜线>,外壳应使用PATH指定的搜索路径来查找包含文件的目录。然而,与正常的命令搜索不同,实用程序搜索的文件不需要是可执行文件。如果找不到可读文件,则非交互式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之间,绝对/ etc。路径。

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命令。