Bash 脚本在空行上打印“找不到命令”

Posted

技术标签:

【中文标题】Bash 脚本在空行上打印“找不到命令”【英文标题】:Bash script prints "Command Not Found" on empty lines 【发布时间】: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执行。 这绝对是***.com/questions/39527571/… 的副本,但这里的许多答案解释了由于其他原因导致“找不到命令”的许多其他情况。如果您的问题不是专门针对空行,建议访问者阅读所有答案 @Atul 我完全同意你的看法。这就是我用 javascript 编写脚本的原因,这使得重用模块化代码变得更加容易。 Python 也适用于此。 【参考方案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】:

试试chmod u+x testscript.sh

我从这里知道: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/

【讨论】:

【参考方案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

【讨论】:

这被认为是一个安全漏洞。 不要将. 添加到您的路径中。 解释为什么这个“答案”是个坏主意:superuser.com/questions/156582/…【参考方案16】:

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

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

【讨论】:

以上是关于Bash 脚本在空行上打印“找不到命令”的主要内容,如果未能解决你的问题,请参考以下文章

linux 环境下bash脚本中找不到命令

在 bash 循环中执行时查找“找不到命令”

CoffeeScript 不工作“-bash:咖啡:找不到命令”

sh:parse_git_branch:找不到命令

-bash: imp: 找不到命令 oracle

Git Bash bash:打开:找不到命令