Bash脚本在空行上显示“找不到命令”


111

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

该脚本可以运行,但是Command Not Found屏幕上始终为每个空行打印一条语句。每个空白行都会导致找不到命令。

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

这是脚本:

#!/bin/bash

echo Hello World

我通过键入以下命令来运行它:

bash testscript.sh

为什么会发生这种情况?


严重的是,网络上充斥着这样的抱怨。壳牌很弱,解释者me脚。到处都是,它失败了。您甚至必须观看脚本中的所有空白。我的脚本因看不见换行符而失败。可能这只是空格重要的脚本语言!
阿图尔

1
使用bash -x scriptname.sh跟踪误差。–在我的情况下,这是一个在Windows下保存的sh文件,其中VSCode和行结尾为“ CRLF”。在右下角的VSCode中,您可以将行终止符从“ CRLF”更改为“ LF”。上载了此文件,最终可以使用执行该文件bash scriptname.sh
Kai Noack

这肯定是stackoverflow.com/questions/39527571/…的副本,但是这里的许多答案解释了由于其他原因而导致您“未找到命令”的许多其他情况。如果您的问题并非专门针对空行,则建议访客阅读所有答案
点钟

Answers:


161

确保您的第一行是:

#!/bin/bash

输入您的bash路径(如果不是) /bin/bash


尝试运行:

dos2unix script.sh

这样会将行尾等从Windows转换为Unix格式。即,它从行尾去除\ r(CR),将其从更改\r\n (CR+LF)\n (LF)

有关dos2unix命令的更多详细信息(手册页)


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

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

输出将如下所示:

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

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


因为他是直接运行它的,所以这可能不是必需的bash scriptname.sh(当然,这仍然是一种好习惯)。
paxdiablo 2011年

1
嗨#!/ bin / bash是我脚本的第一行
David

1
@chown-我在Mac上也遇到了同样的问题。我偶然发现了这篇文章。我不确定它是否有助于OP。但是您的解决方案对我有所帮助。
Prashant

1
谢谢。这正是我所面临的问题。这个答案使它起作用。
slayedbylucifer 2012年

5
在开车时如何写编程问题的答案?
奥马尔·塔里克

61

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


47

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

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

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


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

这是对我有用的答案,总是被告知我没有许可,所以我对它进行了修改,并被告知找不到命令。我没想到要检查权限。
DiamondDrake

1
感谢Lypso345,这解决了我遇到的问题。
ammills01 '16

chmod 777 testscript.sh FTW
GeneCode 2017年

16

这可能是微不足道的,并且与OP的问题无关,但是当我开始学习脚本时,我经常把它弄错了

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

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

VAR_NAME=$(hostname)

11

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

一种方法是将a set -x放在脚本的顶部或与其一起运行,bash -x而不是仅运行bash-在执行之前将输出这些行,并且您通常只需要在错误发生之前立即查看命令输出,以查看引起问题的原因

如果像你说的,它的空行造成的问题,你可能要检查什么actaully 他们。跑:

od -xcb testscript.sh

并确保没有CTRL-M使用Windows类型的编辑器可能获得的“看不见”的有趣字符,例如(回车)。


为“ od”命令+1!太酷了,我不知道!谢谢!
chown

11

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

run_me.sh 

开头没有./并出现相同的错误。

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

./run_me.sh



6

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

/home/Manuel/mywrittenscript

实际上,shell根本不关心文件扩展名。不确定是否应将此作为单独的答案发布。
三人房

当然。在Linux文件系统的违背窗口的延伸仅仅用作名称,说什么有关文件的content.I的一部分,不能说在我的情况的约束。
Masood Moghini '16

6

如果您具有Notepad ++,并且收到此.sh错误消息:“找不到命令” 或此autoconf错误消息“第615行:../../autoconf/bin/autom4te:无此类文件或目录”

在您的Notepad ++上,转到编辑 -> EOL转换,然后检查Macinthos(CR)。这将编辑您的文件。我也鼓励使用此命令检查所有文件,因为不久将发生此类错误。


谢谢你 就我而言,我在busybox linux发行版上运行脚本。我的脚本中所有空行都出现了相同的错误“找不到”。if / else语句也有问题。将Notepad ++中的EOL更改为Unix可以解决此问题。
GeneCode

4

有同样的问题。不幸

dos2unix winfile.sh
bash: dos2unix: command not found

所以我做了这个转换。

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

然后

bash unixfile.sh

2

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

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

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


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后,我才发现问题。


shellcheck可以在线获取,尽管您当然需要准确地复制并粘贴脚本才能提供帮助。 shellcheck.net
Tripleee,2017年

0

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



-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.