我有以下设置
└── 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
答案 0 :(得分:4)
是。这就是.
/ source
运算符的工作方式。
来自spec:
shell应该从当前环境中的文件执行命令。
如果文件不包含<斜杠>,则shell应使用 PATH 指定的搜索路径来查找包含 file 的目录。但是,与普通命令搜索不同, dot 实用程序搜索的文件无需执行。如果未找到可读文件,则非交互式shell将中止;交互式shell应将诊断消息写入标准错误,但不应将此条件视为语法错误。
因此,当您使用source file.sh
时,$PATH
中的shell会进行搜索,但当您使用source dir/file.sh
时,会跳过$PATH
次查找,并假设dir
为相对于当前目录。
要执行此类操作(在main.sh
或major.sh
内部),您可以使用Can a Bash script tell what directory it's stored in?来查找要使用的相应绝对路径。
对于一般用途,您需要将它们全部放在绝对/等的$PATH
或source
中。路径。
答案 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 。