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

每次我从 Debian 的命令行使用 bash scriptname.sh运行一个脚本时,我都会得到 Command Not found和该脚本的结果。

这个脚本可以工作,但是对于每个空行,屏幕上总是会打印一个 Command Not Found语句。每个空行都会导致找不到命令。

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

剧本如下:

#!/bin/bash


echo Hello World

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

bash testscript.sh

为什么会这样?

446524 次浏览

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

确保你的第一句话是:

#!/bin/bash

如果 bash 不是 /bin/bash,请输入您的 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>

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

如果脚本的工作(相对而言)做得很好,那么它运行得很好。您的问题可能是文件中的一行引用了一个程序,这个程序要么没有在路径上,要么没有安装,要么拼写错误,或者类似的情况。

一种方法是在脚本的顶部放置一个 set -x,或者用 bash -x而不仅仅是 bash运行它——这将在执行之前输出这些行,你通常只需要在发生错误之前立即查看命令输出,看看是什么导致了问题

如果正如您所说的,是空行导致了问题,您可能需要检查它们实际上是什么 进去。跑步:

od -xcb testscript.sh

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

在脚本文件中使用 dos2unix

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

@ artooro 在评论中补充道:

要修复这个问题,运行 chmod +x testscript.sh

我还吃了一些 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之后,我才发现问题。

你必须提供它的完整路径 比如说

/home/Manuel/mywrittenscript

很不幸,我也有同样的问题

dos2unix winfile.sh
bash: dos2unix: command not found

所以我这么做是为了转换信仰。

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

然后

bash unixfile.sh

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

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

(请注意“”后面的额外空间)会导致问题,但是当您删除该空间时,它会运行得非常好。

如果你有记事本 + + 并且你得到了这个. sh 错误消息: < strong > “ command not found” 或者这个 autoconf 错误消息“615行: . ./. ./autoconf/bin/auto4te: 没有这样的文件或目录”.

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

这可能是琐碎的,并且与 OP 的问题无关,但是我在开始学习脚本时经常犯这个错误

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

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

VAR_NAME=$(hostname)

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

run_me.sh

在开始时没有./,并得到相同的错误。

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

./run_me.sh

加入工作目录(.)到 PATH 来执行一个脚本,只需键入其名称,就可以执行工作目录中的脚本:

PATH=.:$PATH

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

您可能需要使用别名更新.bashrc 和.bash _ profile 文件,以识别所输入的命令。

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