你能让一个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$
答案1
source
是内置命令的另一个名称.
,但仅在某些 shell 中如此。.
符合 POSIX,它是便携式的;source
不是。
编写代码时sh
,应仅使用可移植的 shell 功能。编写代码的基本要点sh
是使其在任何的实现sh
。通常,可能是指向或某个其他 shell 的sh
符号链接。即使此 shell 本身支持,当将其调用为 时,它可能支持也可能不支持。即使此 shell 本身在将其调用为 时支持,当您要解释代码时,编写不可移植的代码仍然是一种不好的做法。bash
dash
source
sh
source
sh
sh
也许您的/bin/sh
不支持source
;如果是这样,它将把 视为source
任何source ./sourced.sh
其他非关键字且非内置的。然后也许source
您的某个目录中有一个可执行文件$PATH
;如果是这样,shell 将尝试运行它。然后也许该文件的模式不允许您运行它;如果是这样,错误消息将是source: Permission denied
。
一种解决方案是使用.
而不是source
。任何人sh
都应该.
以您期望的方式sh
理解source
。
在我看来,将source
其作为可执行文件并不常见。上述假设虽然合理,但可能或者可能不会取决于您的具体情况。即使解决方案不能(或不能完全)解决您的具体情况,在 shell 代码中使用.
而不是source
为了sh
仍然是正确的事情。