Bash脚本在空行上打印“Command Not Found”

时间:2011-09-09 13:39:21

标签: linux bash debian

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

该脚本有效,但屏幕上始终显示每个空行的Command Not Found语句。每个空白行都会导致找不到命令。

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

这是脚本:

#!/bin/bash

echo Hello World

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

bash testscript.sh

为什么会发生这种情况?

16 个答案:

答案 0 :(得分:147)

确保您的第一行是:

#!/bin/bash

如果不是/bin/bash

,请输入bash的路径

尝试跑步:

dos2unix script.sh

将Windows的行结尾等转换为unix格式。即从行尾中剥离\ r \ n(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>

这将输出整个文件文本,并为文件中的每个<CR>字符显示\r

答案 1 :(得分:53)

您可以使用bash -x scriptname.sh跟踪它。

答案 2 :(得分:38)

我也遇到过类似的问题。问题似乎是权限。如果您执行new_list = [i for i in text_words1 if not i.startswith(('@','#'))] ,则可能能够识别出您的文件可能没有打开执行位。这将不允许脚本执行。 :)

正如@artooro在评论中所说:

  

要解决该问题,请运行ls -l

答案 3 :(得分:10)

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

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

如果正如您所说,这是造成问题的空白行,您可能需要检查中的 。运行:

od -xcb testscript.sh

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

答案 4 :(得分:7)

在脚本文件中使用dos2unix

答案 5 :(得分:6)

如果你有Notepad ++并且你得到这个.sh错误信息:&#34;命令未找到&#34; 或者这个autoconf错误消息&#34;第615行: ../../autoconf/bin/autom4te:没有这样的文件或目录&#34;

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

答案 6 :(得分:6)

这可能是微不足道的,与OP的问题无关,但在我学习脚本时,我常常把这弄错了

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

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

VAR_NAME=$(hostname)

答案 7 :(得分:5)

答案 8 :(得分:5)

执行时必须提供完整路径 例如

/home/Manuel/mywrittenscript

答案 9 :(得分:3)

有同样的问题。不幸的是

dos2unix winfile.sh
bash: dos2unix: command not found

所以我做了这个转换。

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

然后

bash unixfile.sh

答案 10 :(得分:3)

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

run_me.sh 

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

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

./run_me.sh

答案 11 :(得分:2)

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

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

(请注意“\”之后的额外空格会导致问题,但当你删除该空格时,它将完全正常运行。

答案 12 :(得分:0)

我也有一些Cannot execute command。一切看起来都是正确的,但实际上我在我的命令之前有一个不可破坏的空间&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后才能找到问题。

答案 13 :(得分:0)

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

答案 14 :(得分:-1)

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

PATH=.:$PATH

答案 15 :(得分:-1)

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

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