由于这种情况发生在破折号中,并且破折号比较简单,因此我首先看了一下。
看起来像exec.c是查找的地方,而相关的函数是
tryexec,
shellexec只要需要执行shell指令,就会从中调用。tryexec函数(的简化版本)如下:
STATIC voidtryexec(char *cmd, char **argv, char **envp){ char *const path_bshell = _PATH_BSHELL;repeat: execve(cmd, argv, envp); if (cmd != path_bshell && errno == ENOEXEC) { *argv-- = cmd; *argv = cmd = path_bshell; goto repeat; }}因此,如果发生的话,它总是简单地用其自身的路径替换要执行的命令(
_PATH_BSHELL默认为
"/bin/sh")
ENOEXEC。这里真的没有魔术。
我发现FreeBSD
bash本身就表现出相同的行为
sh。
的方式
bash处理这个问题是类似的,但要复杂得多。如果您想进一步研究它,我建议您阅读bash的内容,然后
execute_command.c专门阅读
execute_shell_script然后
shell_execve。这些评论具有描述性。



