Space between # and ! in shebang (# !/usr/bin/ksh)



我正在编写一个Korn Shell脚本,该脚本涉及使用< <()的过程替换,例如:

array=()
while IFS= read -r -d '' x;do
    array+=( "$x" )
done < <(some command)

这试图插入array some command返回的所有字符串。奇怪的是,当我的Shebang看起来像这样时,这起作用了:

# !/usr/bin/ksh

当然是不寻常的(请注意#!之间的空间)。另一方面,当我的shebang看起来像 #!/usr/bin/ksh(显然是正确的方式)时,此脚本会在错误 syntax error: '< ' unexpected失败。为什么是这样?在Shebang中拥有空间有什么不同?Google给了我几个答案,说!#!/usr...之间的空间还可以,但是!#之间的空间一无所有。

# !是无效的shebang,完全被忽略了。没有Shebang的脚本的行为取决于您如何调用它。

如果从外壳调用:有些外壳使用/bin/sh运行此类脚本;其他人将自己用于这个目的。大概是您在测试此测试时与您交互使用的外壳(并在后一个集合中找到脚本仅适用于无效的Shebang),因此您的脚本实际上是用bash运行的,或者其他您的脚本当时有源交互式外壳。

如果没有外壳调用:大多数操作系统都会拒绝执行这样的二进制。


真正的David Korn KSH93正确支持过程替代,但是一些第三方克隆和古代KSH实施却没有。

如果您要使用KSH,则强烈首选使用真正的David Korn KSH93(不是MKSH,PDKSH或其他第三方克隆),并且(就您的直接点而言)将确保过程替代支持。

最新更新