【问题标题】:Bash script prints "Command Not Found" on empty linesBash 脚本在空行上打印“找不到命令”
【发布时间】:2011-11-13 19:39:38
【问题描述】:

每次我在 Debian 的命令行中使用bash scriptname.sh 运行脚本时,我都会得到Command Not found,然后是脚本的结果。

脚本有效,但屏幕上总是为每个空行打印一个Command Not Found 语句。每个空行都会导致找不到命令。

我正在从/var 文件夹运行脚本。

这是脚本:

#!/bin/bash

echo Hello World

我通过输入以下内容来运行它:

bash testscript.sh

为什么会发生这种情况?

【问题讨论】:

  • 说真的,网络上充斥着这样的抱怨。 Shell 是非常弱和蹩脚的解释器。这里和那里很少,它失败了。您甚至必须查看脚本中的所有空格。由于不可见的换行符,我的脚本失败了。可能这只是空格很重要的脚本语言!
  • 使用bash -x scriptname.sh 跟踪错误。 – 在我的情况下,它是在 Windows 下保存的 sh 文件,带有 VSCode 和行结尾为“CRLF”。在右下角的 VSCode 中,您可以将行终止符从“CRLF”更改为“LF”。上传了这个文件,最后可以用bash scriptname.sh执行。
  • 这绝对是stackoverflow.com/questions/39527571/… 的副本,但这里的许多答案解释了由于其他原因导致“找不到命令”的许多其他情况。如果您的问题不是专门针对空行,建议访问者阅读所有答案
  • @Atul 我完全同意你的看法。这就是我用 JavaScript 编写脚本的原因,这使得重用模块化代码变得更加容易。 Python 也适用于此。

标签: linux bash debian


【解决方案1】:

确保您的第一行是:

#!/bin/bash

如果不是/bin/bash,请输入你的bash路径


尝试运行:

dos2unix script.sh

这会将行尾等从 Windows 转换为 unix 格式。即它从行尾中删除 \r (CR) 以将它们从 \r\n (CR+LF) 更改为 \n (LF)

More details about the dos2unix command (man page)


另一种判断文件是否为dos/Win格式的方法:

cat scriptname.sh | sed 's/\r/<CR>/'

输出将如下所示:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

这将输出整个文件文本,并为文件中的每个 \r 字符显示 &lt;CR&gt;

【讨论】:

  • 这可能没有必要,因为他直接使用bash scriptname.sh 运行它(当然,这仍然是一个好习惯)。
  • 嗨 #!/bin/bash 是我脚本的第一行
  • @chown - 我在 Mac 上遇到了同样的问题。我偶然发现了这篇文章。我不确定它是否对 OP 有帮助。但你的解决方案帮助了我。
  • 谢谢。这正是我面临的问题。这个答案让它工作了。
  • 开车时如何写一个编程问题的答案?
【解决方案2】:

你可以使用bash -x scriptname.sh来追踪它。

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题。问题似乎是权限。如果您执行ls -l,您可能能够识别出您的文件可能没有打开执行位。这将不允许脚本执行。 :)

    正如@artooro 在评论中添加的那样:

    要解决该问题,请运行 chmod +x testscript.sh

    【讨论】:

    • 要解决这个问题运行chmod +x testscript.sh
    • 这是对我有用的答案,总是被告知我没有权限,所以我 sudo'ed 并被告知找不到命令。我没想过要检查权限。
    • 感谢 Lypso345,这解决了我遇到的问题。
    • chmod 777 testscript.sh FTW
    • 这就是我的答案。谢谢。
    【解决方案4】:

    这可能是微不足道的,与OP的问题无关,但是我在开始学习脚本时经常犯这个错误

    VAR_NAME = $(hostname)
    echo "the hostname is ${VAR_NAME}"  
    

    这将产生“找不到命令”响应。正确的做法是消除空格

    VAR_NAME=$(hostname)
    

    【讨论】:

      【解决方案5】:

      在 Bash for Windows 上我尝试错误地运行

      run_me.sh 
      

      开头没有 ./ 并得到同样的错误。

      对于具有 Windows 背景的人来说,正确的表单看起来是多余的:

      ./run_me.sh
      

      【讨论】:

      • 在 linux-gnu bash 系统上相同:myscript 返回bash: myscript: command not found./myscript 工作
      【解决方案6】:

      如果脚本(相对)很好地完成了它的工作,那么它运行正常。您的问题可能是文件中的一行引用了不在路径上、未安装、拼写错误或类似情况的程序。

      一种方法是在脚本顶部放置set -x 或使用bash -x 运行它,而不仅仅是bash - 这将在执行它们之前输出这些行,您通常只需要查看命令在错误之前立即输出以查看导致问题的原因

      如果,如您所说,是空白行导致了问题,您可能需要检查它们的实际内容 。运行:

      od -xcb testscript.sh
      

      并确保没有像 CTRL-M(回车)这样的“隐形”有趣字符,您可以通过使用 Windows 类型的编辑器获得。

      【讨论】:

      • +1 表示“od”命令!太棒了,我不知道!谢谢!
      【解决方案7】:

      在您的脚本文件中使用dos2unix

      【讨论】:

        【解决方案8】:

        为了执行,你必须提供完整的路径 例如

        /home/Manuel/mywrittenscript
        

        【讨论】:

        • 确实,shell 根本不关心文件扩展名。不确定这是否值得作为单独的答案发布。
        • 当然 .in linux 文件系统与 windows 扩展相反,仅用作名称的一部分,并没有说明文件的内容。我不能说 在我的情况下约束。
        • 谢谢这对我有帮助,我只给出了文件名,现在它在我给出正确的路径后运行
        【解决方案9】:

        【讨论】:

          【解决方案10】:

          如果您有 Notepad++ 并且收到此 .sh 错误消息:“command not found” 或此 autoconf 错误消息“第 615 行: ../../autoconf/bin/autom4te: 没有这样的文件或目录”

          在 Notepad++ 上,转到 编辑 -> EOL Conversion,然后检查 Macinthos(CR)。 这将编辑您的文件。我还鼓励使用此命令检查所有文件, 因为很快就会发生这样的错误。

          【讨论】:

          • 谢谢。就我而言,我在busybox linux发行版上运行脚本。在我的脚本中的所有空行中都有相同的错误“未找到”。 if/else 语句也有问题。将 Notepad++ 中的 EOL 更改为 Unix 修复了它。
          【解决方案11】:

          遇到了同样的问题。不幸的是

          dos2unix winfile.sh
          bash: dos2unix: command not found
          

          所以我这样做是为了转换。

           awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh
          

          然后

          bash unixfile.sh
          

          【讨论】:

            【解决方案12】:

            运行脚本的问题也可能与多行命令的格式错误有关,例如,如果您在换行符“\”之后有一个空格字符。例如。这个:

            ./run_me.sh \ 
            --with-some parameter
            

            (请注意“\”后面的多余空格)会导致问题,但是当您删除该空格时,它会运行得很好。

            【讨论】:

              【解决方案13】:

              我也有一些Cannot execute command。一切看起来都是正确的,但实际上我在我的命令之前有一个牢不可破的空间&amp;nbsp;,这当然是肉眼无法发现的:

              if [[ "true" ]]; then
                &nbsp;highlight --syntax js "var i = 0;"
              fi
              

              在 Vim 中看起来像:

              if [[ "true" ]]; then
                highlight --syntax js "var i = 0;"
              fi
              

              只有在运行 Bash 脚本检查器shellcheck 之后我才发现问题。

              【讨论】:

              • shellcheck 可在线获得,但您当然需要准确地复制+粘贴您的脚本才能获得帮助。 shellcheck.net
              【解决方案14】:

              我今天遇到了这个问题,心不在焉地将美元命令提示符$(在命令字符串之前)复制到脚本中。

              【讨论】:

                【解决方案15】:

                将当前目录 ( . ) 添加到 PATH 以便能够执行脚本,只需输入其名称即可,该脚本位于当前目录中:

                PATH=.:$PATH
                

                【讨论】:

                【解决方案16】:

                您可能希望使用别名更新 .bashrc 和 .bash_profile 文件以识别您正在输入的命令。

                .bashrc 和 .bash_profile 文件是隐藏文件,可能位于您保存程序文件的 C: 驱动器上。

                【讨论】:

                  猜你喜欢
                  • 2022-01-04
                  • 2020-10-15
                  • 1970-01-01
                  • 2016-09-27
                  • 1970-01-01
                  • 2015-08-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多