【问题标题】:Space between # and ! in shebang (# !/usr/bin/ksh)# 和 ! 之间的空格在 shebang (# !/usr/bin/ksh)
【发布时间】:2017-12-20 16:02:50
【问题描述】:

我正在编写一个涉及使用< <() 进行进程替换的 Korn shell 脚本,如下所示:

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

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

# !/usr/bin/ksh

这当然是不寻常的(注意#! 之间的空格)。另一方面,当我的 shebang 看起来像 #!/usr/bin/ksh(显然是正确的方式)时,此脚本将失败并出现错误 syntax error: '&lt; ' unexpected。为什么是这样?在 shebang 中有一个空间意味着什么?谷歌给了我几个答案,说!#!/usr... 之间的空格是可以的,但没有关于!# 之间的空格。

【问题讨论】:

    标签: shell ksh shebang


    【解决方案1】:

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

    如果从 shell 调用:一些 shell 使用/bin/sh 来运行这样的脚本;其他人使用自己的目的。大概您在测试时交互使用的 shell(并发现脚本只能与无效的 shebang 一起使用)在后一组中,因此您的脚本 实际上 正在使用 bash 运行,或者您的当时活跃的交互式外壳。

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


    Real David Korn ksh93 正确支持进程替换,但某些第 3 方克隆和古老的 ksh 实现不支持。

    如果您要使用 ksh,强烈建议使用真正的 David Korn ksh93(不是 mksh、pdksh 或其他第 3 方克隆),并且(就您而言)将确保进程替换支持。

    【讨论】:

    • 也有可能/bin/sh 是指向 ksh 的符号链接,或指向实现脚本使用的功能的某个 shell。
    • 我通过 Cygwin 安装了 ksh,它提供了不支持进程替换的 mksh。您是否可以向我指出如何在 Windows 上安装 ksh93 的指南(对不起,这里是菜鸟)。
    • 通过谷歌搜索,github.com/att/ast 看起来是您的最佳选择。
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2019-05-29
    • 2021-11-08
    • 2014-08-05
    • 2019-01-20
    • 2017-10-03
    • 2014-12-17
    • 2011-07-29
    相关资源
    最近更新 更多