【问题标题】:Shell scripting: new line command not foundShell 脚本:未找到新行命令
【发布时间】:2016-02-22 01:48:54
【问题描述】:

我正在尝试从命令行运行我的 shell 脚本,比如说;

我的脚本如下所示:

#!bin/bash

echo hello

尝试运行此源 ./abcd.sh 时出现此错误。

"' is not a typo you can run the following command to lookup the package that contains the binary:
    command-not-found 
: command not found
hello
"

在“echo hello”之前有一个空行有什么问题之前从未见过这个?我想知道有没有其他人遇到过这样的事情。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。您是否有机会在 Ubuntu 系统或 Ubuntu 衍生产品上运行?只是好奇...

标签: shell


【解决方案1】:

除了脚本的第一行是注释外,听起来您的文件具有 DOS 行结尾,并且回车被视为未找到的命令。错误消息听起来像是自定义 command_not_found_handle 函数(我相信是 Ubuntu 定义的)提供的。

【讨论】:

  • 这解决了我的问题。我在 Windows 上编辑脚本并在 Ubuntu 上运行。我在编辑器中将换行符更改为“unix”模式,重新保存,然后瞧——问题解决了。
【解决方案2】:
#!bin/bash

需要

#!/bin/bash

或安装 bash 的任何位置(您可以通过 whereis bash 找到它)。

当使用 bash 调用时,您的程序应该可以正常工作,即 bash ./abcd.sh,但是当直接执行 ./abcd.sh 时,hashbang 行确实很重要,因为这是为包含在可执行文件中的脚本定位解释器的方式。

【讨论】:

    【解决方案3】:

    试试echo 'hello',用引号括起来。看起来echo 命令和hello 之间有一个换行符,它正在尝试将“hello”作为命令运行。

    hashbang 行应该是 #!/bin/bash,但把它搞砸并不重要,因为它会将任何以 hash 开头的行解释为注释。

    【讨论】:

    • 它也适用于 echo hello,没有任何引号。这里唯一的错误是第一行,应该是:#!/bin/bash
    • #! 行不是(简单的)注释行。 “shebang”(#!)后面是要执行的命令的路径名。如果脚本是从根目录(/)按名称运行的,它可能会起作用;在其他地方,除非有一个子目录bin 包含一个程序bash,它将正确执行脚本的其余部分。这也是内核级别的功能。当然,bash 本身会将第一行视为注释(一旦它运行),但内核已经完成了解释。当脚本运行bash abcd.sh时,内核不做shebang处理。
    【解决方案4】:

    使用调试选项运行脚本以查看实际失败的行:

    bash -x abcd.sh
    

    注意:在这种情况下,Shebang 行将被视为注释,因此如果脚本的其余部分正确,它将正确执行:

    $ bash -x abcd.sh
    + echo hello
    hello
    

    【讨论】:

      【解决方案5】:

      确保您的文件没有BOM 在 Windows 下使用 Notepad++ 编辑脚本时,我遇到了同样的问题。 确保转换为“UTF-8 witout BOM”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多