0

在我的一次采访中,我遇到了一个关于 shell 脚本的非常基本的问题,但我找不到答案。问题是:如果脚本的第一行是“#!/bin/ksh”,我可以在 bash 上执行它吗?

我的回答是否定的。在脚本的第一行包含指令的原因是要告诉需要使用哪个解释器。但面试官对这个问题的回答是肯定的。任何人都可以解释我的原因吗?

4

1 回答 1

3

是的,你可以:

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权限。

于 2013-09-07T23:26:49.623 回答