在我的一次采访中,我遇到了一个关于shell脚本的基本问题,我找不到答案。问题是:如果脚本的第一行是“#!/ bin / ksh”,我可以在bash上执行吗?
我的答案是否定的。将指令作为第一行脚本包含的原因是告诉需要使用哪个解释器。但采访者对这个问题的回答是肯定的。任何人都能解释一下原因吗?
答案 0 :(得分:3)
是的,你可以:
bash yourscript
当然,如果有特定于语言的功能,它会抛出一些错误。但问题没有说明它是否应该正常工作。
来自man bash
:
假设第一个参数是包含shell命令的文件的名称。如果以这种方式调用bash,则将$ 0设置为文件名,并将位置参数设置为其余参数。 Bash从该文件中读取并执行命令,然后退出。 Bash的退出状态是脚本中执行的最后一个命令的退出状态。如果没有执行任何命令,则退出状态为0.首先尝试在当前目录中打开文件,如果没有找到文件,则shell在PATH中搜索目录中的脚本
实际上,这正是程序加载器将要做的事情。以下是wikipedia shebang article的引用:
在类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复制(或链接)到同一路径。 TAA-DAA!可能需要root权限。