#!/ bin / bash-没有这样的文件或目录


69

我创建了一个bash脚本,但是当我尝试执行它时,我得到了

#!/bin/bash no such file or directory

我需要运行命令:bash script.sh它才能工作。

我怎样才能解决这个问题?


我现在在cygwin下遇到这个问题,我可以发誓它的脚本已经在正常运行。我检查了所有答案,但似乎都不合适。其他问题和答案也提到了32/64位问题,但是对于shell脚本,可以将其排除在外,对吗?

找到了原因,加入新的细节前面回答unix.stackexchange.com/a/450389/62636的情况下,有人还使用了#!/usr/bin/env bash代替#!/bin/bash,也期待在这里...

Answers:


100

这种消息通常是由于伪造的shebang行造成的,或者是在第一行的末尾有一个额外的回车符,还是在它的开头有一个BOM表。

跑:

$ head -1 yourscript | od -c

看看结局如何。

这是错误的:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

这也是错误的:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

这是对的:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

使用dos2unix(或sedtrawkperlpython...)来修复你的脚本,如果这是问题。

这是将删除BOM和尾随CR的一个:

sed -i '1s/^.*#//;s/\r$//' brokenScript


请注意,您用于运行脚本的外壳会稍微影响所显示的错误消息。

这是三个脚本,它们仅显示其名称(echo $0),并分别具有以下shebang行:

CorrectScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

在bash下,运行它们将显示以下消息:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

通过显式调用解释器来运行伪造的伪造脚本,CRLF脚本可以毫无问题地运行:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

这是在以下情况下观察到的行为ksh

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

及以下dash

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
揭示这是否是问题的另一种方法是hexdump -C yourscript | head -n 1。我仍然会使用dos2unix yourscript它来修复它。
凯文M

是的,很可能是那样。我在Windows上进行了编辑。小费的事情。
Nicolas de Fontenay

1
如果这是一个CRLF问题,您将不会看到#!/bin/bash no such file or directory错误消息,因为没有理由尝试执行或打开#!/bin/bash。这/bin/bash<CR>将执行。
斯特凡Chazelas

1
@stephaneChazelas由于dos2unix解决了该问题,因此毫无疑问这不是CRLF问题。错误信息可能是不准确的只是转录..
jlliagre

6
dos2unix还删除了UTF-8 BOM。UTF-8 BOM可能已经解释了错误消息。
斯特凡Chazelas


9

实际上,bash脚本的正确shebang是这样的:

#!/usr/bin/env bash

因为在FreeBSD中,bash位于 /usr/local/bin/bash


13
在这种情况下,“正确”一词很难使用。也许更好的说法是“较少出错”。
HalosGhost 2014年

1
这也很可怕。假设/ usr存在是一个不好的IMO。例如,Haiku没有/ usr。
jessicah

9

您可以使用vi来解决这两个问题(如果存在):

vi <your_file>
:set ff=unix
:set nobomb
:wq

答案应尽可能独立。这个问题没有提到两个问题。如果您要以其他答案为基础,则至少应说出它们是什么。更好的是,您应该解释这如何回答问题。
G-Man

无需下载更多Windows工具即可快速修复,谢谢!
蒸汽动力

1
@ G-Man其他答案已经比我希望介绍的要详细得多。无需重复,但如果不是很明显,则可以使用WIndows行结尾和隐藏的Windows BOM字符。我认为许多正在寻找答案的人都喜欢简洁而不是自成一体,尤其是在其他答案中有更多细节时。
cwash

4

如果您没有dos2unix,则这是解决此问题的一种方法。

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

字节顺序标记(BOM)

这可能是由BOM表引起的。在Wikipedia中,BOM是

字节顺序标记(BOM)是Unicode字符U + FEFF字节顺序标记(BOM),在文本流开始时其外观为魔术数字,可向使用该文本的程序发出信号

不幸的是,它没有向处理she-bang线的Linux内核发出任何信号。您可以使用来验证您是否具有BOM表file

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

或者,您可以十六进制转储前几个字符,然后手动查看它们是否与任何BOM字符匹配

一旦知道了BOM字符,就可以删除它们,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

我的问题是不小心将错误的bash可执行文件添加到PATH,因为在我的脚本中使用了更灵活的#!/usr/bin/env bashshebang(从路径中获取第一个bash可执行文件)。

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

我已经安装了适用于Windows的GIT,以便cygwin与Windows GIT GUI一起使用(不适用于cygwin本机git ...)。我现在解决了这个通过切换到#!/bin/bashsheband并从窗口删除GIT PATH


-3

尝试 #!/bin/bash

第二件事:find / -name bash
第三件事:ls -al /bin/bash


或者只是which bash。我们知道它正在寻找一个,因为它正在与一起工作bash script.sh
凯文-

真正。如前所述,有一种更加可移植的/ usr / bin / env方法,可以让程序为您定位bash(或其他解释器)。无需对pah进行硬编码。
汉尼斯,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.