Shell脚本:使用pwd时出现“坏的解释器:没有这样的文件或目录”错误

26

我想用for循环遍历一个目录中的文件,但是出现了这个问题。

echo: bad interpreter: No such file or directory

代码:

#!/bin/bash
count=0
dir=`pwd`
echo "$dir"
FILES=`ls $dir`
for file in $FILES
do
 if [ -f $file ]
 then
  count=$(($count + 1))
 fi
done
echo $count

第一个echo仅用于显示目录,最后一个echo是为计数器服务。 - Alek
1
你是不是真的复制/粘贴了你的代码?你那里的if语句有语法错误。 - Mat
刚刚修复了缺失的空格,但是仍然出现相同的错误。 - Alek
在进行此类文件处理时,请勿使用ls。改用通配符for file in *; do ... - Ansgar Wiechers
@bharath 也许你遇到了类似的问题:https://dev59.com/v3E85IYBdhLWcg3wUBoZ#52442368 文件看起来没问题,但是“陈旧的文件句柄”导致文件系统出现了一些问题。 - gaoithe
显示剩余2条评论
12个回答

38

我曾经遇到过同样的问题。对我来说,删除#!/bin/bash就解决了问题。似乎不需要添加bash所在路径,因为它在系统路径中。

我在这里找到了另一个解决方案。将

#!/bin/bash

改为

#!/usr/bin/bash


这将导致其他系统出现错误。例如,您的第二个"shebang line"在Centos 6上无法工作。 - Ondra Žižka
这个解决方案对我很有效! - undefined

13

echo: bad interpreter: No such file or directory 的错误很可能来自于第一行的 #!...,被称为shebang行

关于 #!...

这行提示shell使用哪个解释器来运行文件,可以是例如bash或者sh(它是(粗略地)一个子集,因此许多功能将无法工作),或者基本上任何可以执行文件内容的语言-Perl、Python、Ruby、Groovy等等。

当调用脚本直接执行时,该行会指向系统:

./myScript.sh

这也经常被编辑器用来识别没有后缀名的文件的正确语法高亮显示-例如,Gedit就是这样做的。

解决方案

要覆盖该行,请将脚本作为参数传递给Bash:

bash myScript.sh

或者,您可以“源”它,这意味着在Bash shell中执行以下任一命令:

source myScript.sh
. myScript.sh

这将大致起到您自己粘贴命令的作用。


覆盖我们的源代码和使用 sourcing 都存在问题。您需要修复 shebang,使其指向正确的位置。Sourcing 具有不同的语义,并且通常不安全,除非您在子 shell 中单独运行它。 - tripleee
@tripleee,如果脚本需要分发,修复shebang行是毫无意义的。你永远不知道解释器会在哪里。 - Ondra Žižka
然后你需要一个安装程序,或者类似 #!/usr/bin/env bash 的东西。基本点仍然存在;source 做的事情与在单独进程中运行脚本不同,并且除非你已经检查过脚本以确保在源化时它能正确工作,否则是不安全的。 - tripleee
@tripleee,没错,但在这个问题的背景下,OP可能想知道这种可能性。当然,从gist下载一个随机脚本并进行源代码调用不是一个好主意 :) - Ondra Žižka

8

最好这样做:

#!/bin/bash
count=0
dir="$PWD"
echo "$dir"

for file in "$dir"/*
do
 if [[ -f $file ]]
 then
  ((count++))
 fi
done
echo $count

或者一个最简单/最短的解决方案:

#!/bin/bash

echo "$PWD"

for file; do
 [[ -f $file ]] && ((count++))
done

echo $count

谢谢你的帮助,我在另一个文件中重新编写了代码并修复了if[]。我猜原始文件可能已经损坏了。 - Alek
在这种情况下,"$dir"/* 可以缩写为 ./* 或者只是 *,因为变量包含当前工作目录。 - Ansgar Wiechers
看看我的新的“最简/最短”解决方案。 - Gilles Quénot

6
我刚遇到了相同的问题,发现我的错误在第一行,有一个

标签。
#!bin/bash

代替
#!/bin/bash

5

在我的情况下,bash脚本是在Windows PC上创建的,它在每个换行符前面添加了一个回车符。即\x0D\x0A而不只是\x0A。我使用sed将所有的CRLF替换为LF,现在我的脚本可以正常工作。

sed -i 's//\r/\n//\n/g' /path/to/file.sh

我认为我遇到了同样的问题,我一直看到“\r”未找到的实例。你能告诉我如何使用sed命令来实现这个吗? - CuriousDude
@DNAngel `sed -i 's//\r/\n//\n/g' /path/to/file.sh' @DNAngel `sed -i 's//\r/\n//\n/g' /path/to/file.sh' - fahadash
有关更多详细信息,请参见 https://dev59.com/iFkS5IYBdhLWcg3wu4rL - tripleee
1
如果你是Vim用户,那么set fileformat=unix就是另一个答案。 - pingsoli

2

当文件不是Unix格式时,也可能出现此问题...尝试对文件运行dos2unix,然后再试一次。


2
如果您使用Homebrew安装BASH,只需删除#!/bin/bash即可。

1
删除shebang是非常可疑的建议。也许需要进行编辑,但完全删除它将对许多系统产生意想不到的后果。 - tripleee

2
我按照以下链接的步骤进行操作,问题已得到解决。
参考链接:脚本错误 - 错误的解释器。实际上,在每行末尾都有一个额外的^M符号。因此,在删除它后,对我来说运行良好。
希望这能帮到你!

1
这个重复了一年前fahadash的答案。 - tripleee

1
您可以使用以下命令找到bash的位置:

command

whereis bash

你可以复制bash路径到看到“bad-interpreter”错误的路径。


1

这是一个奇怪的错误。建议尝试找到错误的来源。

其中一件事是检查pwd命令。

type pwd

确保它是 /usr/bin/pwd 或 /bin/pwd,并验证它不是一个脚本:

file /usr/bin/pwd

如果这是一个脚本,我打赌它以以下内容开始:

If it is a script, I bet it starts with

#!echo

pwd 是 Bash 内置命令:type -a pwd - glenn jackman
1
通常是这样的,没错。某些东西导致了"echo: bad interpreter: No such file or directory"错误。我之前见过"Bad interpreter"的唯一情况就是在shell脚本中#!/path行中路径不正确时的exec出现的。 - ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接