我创建了一个bash脚本,但是当我尝试执行它时,我得到了
#!/bin/bash no such file or directory
我需要运行命令:bash script.sh
它才能工作。
我怎样才能解决这个问题?
#!/usr/bin/env bash
代替#!/bin/bash
,也期待在这里...
我创建了一个bash脚本,但是当我尝试执行它时,我得到了
#!/bin/bash no such file or directory
我需要运行命令:bash script.sh
它才能工作。
我怎样才能解决这个问题?
#!/usr/bin/env bash
代替#!/bin/bash
,也期待在这里...
Answers:
这种消息通常是由于伪造的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
这是三个脚本,它们仅显示其名称(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
hexdump -C yourscript | head -n 1
。我仍然会使用dos2unix yourscript
它来修复它。
#!/bin/bash no such file or directory
错误消息,因为没有理由尝试执行或打开#!/bin/bash
。这/bin/bash<CR>
将执行。
dos2unix
还删除了UTF-8 BOM。UTF-8 BOM可能已经解释了错误消息。
这也可能是由UTF-8脚本中的BOM引起的。如果您在Windows中创建脚本,则有时文件开头会出现一些垃圾。
实际上,bash脚本的正确shebang是这样的:
#!/usr/bin/env bash
因为在FreeBSD中,bash位于 /usr/local/bin/bash
这可能是由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