#和之间的空间!在shebang(#!/ usr / bin / ksh)

时间:2017-12-20 16:02:51

标签: shell ksh shebang

我正在编写一个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中有空间有什么区别?谷歌给了我几个答案,说!#!/usr...之间的空格是可以的,但!#之间的空格没有任何关系。

1 个答案:

答案 0 :(得分:2)

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

如果从shell调用:有些shell使用/bin/sh来运行这样的脚本;其他人将自己用于此目的。大概是你在测试时交互式使用的shell(并且发现脚本仅与无效的shebang一起工作)在后一组中,所以你的脚本实际用bash运行,或者否则你当时是活跃的交互式shell。

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

真正的David Korn ksh93正确支持进程替换,但是一些第三方克隆和古老的ksh实现并没有。

如果你要使用ksh,那么使用真正的David Korn ksh93(不是mksh,pdksh或其他第三方克隆)是首选,并且(对你的直接观点)将确保进程替换支持。 / p>