Bash 脚本在空行上打印“找不到命令”
Posted
技术标签:
【中文标题】Bash 脚本在空行上打印“找不到命令”【英文标题】:Bash script prints "Command Not Found" on empty lines 【发布时间】:2011-11-13 19:39:38 【问题描述】:每次我在 Debian 的命令行中使用bash scriptname.sh
运行脚本时,我都会得到Command Not found
,然后是脚本的结果。
脚本有效,但屏幕上总是为每个空行打印一个Command Not Found
语句。每个空行都会导致找不到命令。
我正在从/var
文件夹运行脚本。
这是脚本:
#!/bin/bash
echo Hello World
我通过输入以下内容来运行它:
bash testscript.sh
为什么会发生这种情况?
【问题讨论】:
说真的,网络上充斥着这样的抱怨。 Shell 是非常弱和蹩脚的解释器。这里和那里很少,它失败了。您甚至必须查看脚本中的所有空格。由于不可见的换行符,我的脚本失败了。可能这只是空格很重要的脚本语言! 使用bash -x scriptname.sh
跟踪错误。 – 在我的情况下,它是在 Windows 下保存的 sh 文件,带有 VSCode 和行结尾为“CRLF”。在右下角的 VSCode 中,您可以将行终止符从“CRLF”更改为“LF”。上传了这个文件,最后可以用bash scriptname.sh
执行。
这绝对是***.com/questions/39527571/… 的副本,但这里的许多答案解释了由于其他原因导致“找不到命令”的许多其他情况。如果您的问题不是专门针对空行,建议访问者阅读所有答案。
@Atul 我完全同意你的看法。这就是我用 javascript 编写脚本的原因,这使得重用模块化代码变得更加容易。 Python 也适用于此。
【参考方案1】:
确保您的第一行是:
#!/bin/bash
如果不是/bin/bash
,请输入你的bash路径
尝试运行:
dos2unix script.sh
这会将行尾等从 Windows 转换为 unix 格式。即它从行尾中删除 \r (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>
这将输出整个文件文本,并为文件中的每个 \r
字符显示 <CR>
。
【讨论】:
这可能没有必要,因为他直接使用bash scriptname.sh
运行它(当然,这仍然是一个好习惯)。
嗨 #!/bin/bash 是我脚本的第一行
@chown - 我在 Mac 上遇到了同样的问题。我偶然发现了这篇文章。我不确定它是否对 OP 有帮助。但你的解决方案帮助了我。
谢谢。这正是我面临的问题。这个答案让它工作了。
开车时如何写一个编程问题的答案?【参考方案2】:
你可以使用bash -x scriptname.sh
来追踪它。
【讨论】:
【参考方案3】:我也遇到了类似的问题。问题似乎是权限。如果您执行ls -l
,您可能能够识别出您的文件可能没有打开执行位。这将不允许脚本执行。 :)
正如@artooro 在评论中添加的那样:
要解决该问题,请运行
chmod +x testscript.sh
【讨论】:
要解决这个问题运行chmod +x testscript.sh
这是对我有用的答案,总是被告知我没有权限,所以我 sudo'ed 并被告知找不到命令。我没想过要检查权限。
感谢 Lypso345,这解决了我遇到的问题。
chmod 777 testscript.sh FTW
这就是我的答案。谢谢。【参考方案4】:
这可能是微不足道的,与OP的问题无关,但是我在开始学习脚本时经常犯这个错误
VAR_NAME = $(hostname)
echo "the hostname is $VAR_NAME"
这将产生“找不到命令”响应。正确的做法是消除空格
VAR_NAME=$(hostname)
【讨论】:
【参考方案5】:在 Bash for Windows 上我尝试错误地运行
run_me.sh
开头没有 ./ 并得到同样的错误。
对于具有 Windows 背景的人来说,正确的表单看起来是多余的:
./run_me.sh
【讨论】:
在 linux-gnu bash 系统上相同:myscript
返回bash: myscript: command not found
; ./myscript
工作【参考方案6】:
如果脚本(相对)很好地完成了它的工作,那么它运行正常。您的问题可能是文件中的一行引用了不在路径上、未安装、拼写错误或类似情况的程序。
一种方法是在脚本顶部放置set -x
或使用bash -x
运行它,而不仅仅是bash
- 这将在执行它们之前输出这些行,您通常只需要查看命令在错误之前立即输出以查看导致问题的原因
如果,如您所说,是空白行导致了问题,您可能需要检查它们的实际内容 。运行:
od -xcb testscript.sh
并确保没有像 CTRL-M
(回车)这样的“隐形”有趣字符,您可以通过使用 Windows 类型的编辑器获得。
【讨论】:
+1 表示“od”命令!太棒了,我不知道!谢谢!【参考方案7】:在您的脚本文件中使用dos2unix
。
【讨论】:
【参考方案8】:为了执行,你必须提供完整的路径 例如
/home/Manuel/mywrittenscript
【讨论】:
确实,shell 根本不关心文件扩展名。不确定这是否值得作为单独的答案发布。 当然 .in linux 文件系统与 windows 扩展相反,仅用作名称的一部分,并没有说明文件的内容。我不能说 在我的情况下约束。 谢谢这对我有帮助,我只给出了文件名,现在它在我给出正确的路径后运行【参考方案9】:试试chmod u+x testscript.sh
我从这里知道: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
【讨论】:
【参考方案10】:如果您有 Notepad++ 并且收到此 .sh 错误消息:“command not found” 或此 autoconf 错误消息“第 615 行: ../../autoconf/bin/autom4te: 没有这样的文件或目录”。
在 Notepad++ 上,转到 编辑 -> EOL Conversion,然后检查 Macinthos(CR)。 这将编辑您的文件。我还鼓励使用此命令检查所有文件, 因为很快就会发生这样的错误。
【讨论】:
谢谢。就我而言,我在busybox linux发行版上运行脚本。在我的脚本中的所有空行中都有相同的错误“未找到”。 if/else 语句也有问题。将 Notepad++ 中的 EOL 更改为 Unix 修复了它。【参考方案11】:遇到了同样的问题。不幸的是
dos2unix winfile.sh
bash: dos2unix: command not found
所以我这样做是为了转换。
awk ' sub("\r$", ""); print ' winfile.sh > unixfile.sh
然后
bash unixfile.sh
【讨论】:
【参考方案12】:运行脚本的问题也可能与多行命令的格式错误有关,例如,如果您在换行符“\”之后有一个空格字符。例如。这个:
./run_me.sh \
--with-some parameter
(请注意“\”后面的多余空格)会导致问题,但是当您删除该空格时,它会运行得很好。
【讨论】:
【参考方案13】:我也有一些Cannot execute command
。一切看起来都是正确的,但实际上我在我的命令之前有一个牢不可破的空间&nbsp;
,这当然是肉眼无法发现的:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
在 Vim 中看起来像:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
只有在运行 Bash 脚本检查器shellcheck
之后我才发现问题。
【讨论】:
shellcheck
可在线获得,但您当然需要准确地复制+粘贴您的脚本才能获得帮助。 shellcheck.net【参考方案14】:
我今天遇到了这个问题,心不在焉地将美元命令提示符$
(在命令字符串之前)复制到脚本中。
【讨论】:
【参考方案15】:将当前目录 ( . ) 添加到 PATH 以便能够执行脚本,只需输入其名称即可,该脚本位于当前目录中:
PATH=.:$PATH
【讨论】:
这被认为是一个安全漏洞。 不要将.
添加到您的路径中。
解释为什么这个“答案”是个坏主意:superuser.com/questions/156582/…【参考方案16】:
您可能希望使用别名更新 .bashrc 和 .bash_profile 文件以识别您正在输入的命令。
.bashrc 和 .bash_profile 文件是隐藏文件,可能位于您保存程序文件的 C: 驱动器上。
【讨论】:
以上是关于Bash 脚本在空行上打印“找不到命令”的主要内容,如果未能解决你的问题,请参考以下文章