Bash脚本总是打印“未find命令”
每次我在Debian的命令行中使用bash scriptname.sh
来运行脚本时,我都会得到Command Not found
,然后是脚本的结果。 所以这个脚本可以正常工作,但总是会在屏幕上打印一个Command Not Found
语句。
我从/var
文件夹运行脚本。
这是脚本:
#!/bin/bash echo Hello World
我运行它通过键入以下内容:
bash testscript.sh
更新 – 问题出现在空行。 每个空白行都会导致找不到命令。 为什么会这样呢?
确保你的第一行是:
#!/bin/bash
如果不是/bin/bash
input你的bashpath
尝试运行:
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>
的整个文件。
PS抱歉格式不好,这是从我的iPhone写入开车上class的时候:p。
您可以使用bash -x scriptname.sh
来跟踪它。
我也碰到类似的问题。 这个问题似乎是权限。 如果你做了一个ls -l
,你可能能够识别出你的文件可能没有打开执行位。 这将不允许脚本执行。 🙂
正如@artooro在评论中所说:
要解决这个问题,请运行
chmod +x testscript.sh
如果脚本的工作(相对)好,那么它运行正常。 您的问题可能是引用程序的文件中的一行,该程序不在path中,未安装,拼写错误或类似的东西。
一种方法是在脚本的顶部放置一个set -x
,或者用bash -x
而不是bash -x
来运行它 – 这会在执行它们之前输出这些行,而且通常只需要在出错之前立即查看命令输出看看造成这个问题的原因
如果如你所说,这是造成这些问题的空白线条,那么你可能想要检查它们的行为。 跑:
od -xcb testscript.sh
并确保没有“ CTRL-M
(回车)等“看不见的”有趣的字符,你可以通过使用Windowstypes的编辑器来获得。
在脚本文件上使用dos2unix
。
尝试chmod u+x testscript.sh
我从这里知道: http : //www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
为了执行,你必须提供完整的path
/home/Manuel/mywrittenscript
运行脚本的问题也可能与多行命令格式不正确有关,例如,如果在换行符“\”之后有空格字符。 例如:
./run_me.sh \ --with-some parameter
(请注意“\”之后的额外空格)将导致问题,但是当您删除该空间时,它将运行得很好。
如果你有记事本+ +,你得到这个.sh错误消息: “找不到命令”或这个autoconf错误消息“行615:../../autoconf/bin/autom4te: 没有这样的文件或目录” 。
在记事本++上,转到编辑 – > 终止转换,然后检查Macinthos(CR) 。 这将编辑你的文件。 我也鼓励用这个命令检查所有的文件,因为很快就会出现这样的错误。
我也有一些Cannot execute command
。 一切看起来都是正确的,但事实上,我有一个不可破坏的空间
就在我的命令之前,肉眼不可能发现的:
if [[ "true" ]]; then highlight --syntax js "var i = 0;" fi
在Vim中,这看起来像:
if [[ "true" ]]; then highlight --syntax js "var i = 0;" fi
只有运行Bash脚本检查器shellcheck
后,我发现问题。
有同样的问题。 不幸
dos2unix winfile.sh bash: dos2unix: command not found
所以我做了这个转换。
awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh
接着
bash unixfile.sh
这可能是微不足道的,与OP的问题没有关系,但是当我学习脚本的时候,我经常会犯这个错误
VAR_NAME = $(hostname) echo "the hostname is ${VAR_NAME}"
这将产生“命令未find”的回应。 正确的方法是消除空间
VAR_NAME=$(hostname)
我试图不正确的运行
run_me.sh
没有。\在开始
./run_me.sh
将当前目录(。)添加到PATH,以便能够执行一个脚本,只需键入它的名称,该脚本驻留在当前目录中:
PATH=.:$PATH