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

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

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

#!/bin/bash no such file or directory

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

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

答案1

此类消息通常是由于有错误的 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(或sed, tr, awk, perl... python) 修复您的脚本。

以下是删除 BOM 和尾部 CR 的方法:

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

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

以下是三个脚本,仅显示其名称 ( echo $0) 并具有以下各自的 shebang 行:

正确的脚本:

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

脚本与Bom:

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

带有 CRLF 的脚本:

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

这也可能是由 UTF-8 脚本中的 BOM 引起的。如果您在 Windows 中创建脚本,有时您会在文件开头看到一些垃圾。

答案3

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

#!/usr/bin/env bash

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

答案4

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

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

相关内容