你能让一个sh
脚本调用另一个脚本吗?(显然不是。)
rwb@calleva:~/source$ ls -l
total 8
-rwxr--r-- 1 rwb rwb 50 Oct 22 03:38 caller.sh
-rwxr--r-- 1 rwb rwb 30 Oct 22 03:36 sourced.sh
rwb@calleva:~/source$ cat sourced.sh
#!/bin/sh
echo "sourced.sh"
rwb@calleva:~/source$ ./sourced.sh
sourced.sh
rwb@calleva:~/source$ cat caller.sh
#!/bin/sh
echo "caller.sh"
source ./sourced.sh
rwb@calleva:~/source$ ./caller.sh
caller.sh
./caller.sh: 5: source: Permission denied
rwb@calleva:~/source$
source
是内置函数的替代名称.
,但仅在某些 shell 中有效。.
采用 POSIX,可移植;source
不是。在为 编写代码时
sh
,应该只使用可移植的 shell 功能。编写代码的基本点sh
是使其能够在sh
. 一般来说,可能是或其他一些 shell 的sh
符号链接。即使这个 shell 本身支持,在调用 as 时也可能支持也可能不支持。即使这个 shell 本身支持调用 as 时,当您要解释代码时编写不可移植的代码仍然是一个不好的做法。bash
dash
source
sh
source
sh
sh
也许你
/bin/sh
不支持source
;如果是这样,它将像任何其他非关键字和非内置函数一样source
对待。那么也许您的;中的某个目录中source ./sourced.sh
有一个可执行文件被调用 如果是这样,shell 将尝试运行它。那么也许该文件的模式不允许你运行它;如果是这样,错误消息将为。source
$PATH
source: Permission denied
解决方案是使用
.
而不是source
. 任何人都sh
应该.
以您期望的方式sh
理解source
。(在我看来)作为
source
可执行文件是不常见的。上述假设虽然合理,但在您的特定情况下可能会发生也可能不会发生。即使该解决方案不能(或不能完全)解决您的特定情况,在 shell 代码中使用.
forsource
仍然是sh
正确的选择。