我正在编写一个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...
之间的空格是可以的,但!
和#
之间的空格没有任何关系。
答案 0 :(得分:2)
# !
是一个无效的shebang,完全被忽略了。没有shebang的脚本的行为取决于你如何调用它。如果从shell调用:有些shell使用/bin/sh
来运行这样的脚本;其他人将自己用于此目的。大概是你在测试时交互式使用的shell(并且发现脚本仅与无效的shebang一起工作)在后一组中,所以你的脚本实际用bash运行,或者否则你当时是活跃的交互式shell。
如果没有shell调用:大多数操作系统都会拒绝执行这样的二进制文件。
如果你要使用ksh,那么使用真正的David Korn ksh93(不是mksh,pdksh或其他第三方克隆)是首选,并且(对你的直接观点)将确保进程替换支持。 / p>