sh 源权限被拒绝尝试调用另一个脚本

sh 源权限被拒绝尝试调用另一个脚本

你能让一个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 本身在将其调用为 时支持,当您要解释代码时,编写不可移植的代码仍然是一种不好的做法。bashdashsourceshsourceshsh

也许您的/bin/sh不支持source;如果是这样,它将把 视为source任何source ./sourced.sh其他非关键字且非内置的。然后也许source您的某个目录中有一个可执行文件$PATH;如果是这样,shell 将尝试运行它。然后也许该文件的模式不允许您运行它;如果是这样,错误消息将是source: Permission denied

一种解决方案是使用.而不是source。任何人sh都应该.以您期望的方式sh理解source

在我看来,将source其作为可执行文件并不常见。上述假设虽然合理,但可能或者可能不会取决于您的具体情况。即使解决方案不能(或不能完全)解决您的具体情况,在 shell 代码中使用.而不是source为了sh仍然是正确的事情。

相关内容