每次我在Debian的命令行中使用bash scriptname.sh
运行脚本时,我会得到Command Not found
,然后是脚本的结果。
该脚本有效,但屏幕上始终显示每个空行的Command Not Found
语句。每个空白行都会导致找不到命令。
我正在运行/var
文件夹中的脚本。
这是脚本:
#!/bin/bash
echo Hello World
我通过输入以下内容来运行它:
bash testscript.sh
为什么会发生这种情况?
答案 0 :(得分:147)
确保您的第一行是:
#!/bin/bash
如果不是/bin/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)
尝试chmod u+x testscript.sh
我从这里知道: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
答案 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
。一切看起来都是正确的,但实际上我在我的命令之前有一个不可破坏的空间
,这是不可能用肉眼发现的:
if [[ "true" ]]; then
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:驱动器上。