在我的一次采访中,我遇到了一个关于 shell 脚本的非常基本的问题,但我找不到答案。问题是:如果脚本的第一行是“#!/bin/ksh”,我可以在 bash 上执行它吗?
我的回答是否定的。在脚本的第一行包含指令的原因是要告诉需要使用哪个解释器。但面试官对这个问题的回答是肯定的。任何人都可以解释我的原因吗?
是的,你可以:
bash yourscript
当然,如果有语言特定的功能,它会抛出一些错误。但问题没有具体说明它是否应该正常工作。
来自man bash
:
第一个参数假定为包含 shell 命令的文件的名称。如果以这种方式调用 bash,则将 $0 设置为文件名,并将位置参数设置为其余参数。Bash 从这个文件中读取并执行命令,然后退出。Bash 的退出状态是脚本中执行的最后一个命令的退出状态。如果没有执行命令,则退出状态为 0。首先尝试打开当前目录中的文件,如果没有找到文件,则 shell 在 PATH 中的目录中搜索脚本
事实上,这正是程序加载器要做的事情。这是维基百科shebang文章的引述:
在类 Unix 操作系统下,当带有 shebang 的脚本作为程序运行时,程序加载器将脚本初始行的其余部分解析为解释器指令;而是运行指定的解释器程序,将尝试运行脚本时最初使用的路径作为参数传递给它。例如,如果脚本以路径“path/to/script”命名,并且它以以下行开头:
#!/bin/sh
然后程序加载器被指示运行程序“/bin/sh”(通常这是 Bourne shell 或兼容的 shell),将“path/to/script”作为第一个参数传递。
如果他们说Oh, but can you execute it in bash just by using ./script ?
,那么答案仍然是肯定的。删除/bin/ksh
并将 bash 复制(或链接)到同一路径。哒哒!不过可能需要root权限。