我创建了一个 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