这个错误:
bash: ./install.sh: /bin/bash^M: 错误的解释器: 没有那个文件或目录
本质原因是:install.sh 文件使用了 Windows 的换行符(CRLF),而 Linux 需要 Unix 换行符(LF)。
原因解释
Linux 执行脚本时,会读取第一行:
#!/bin/bash
作为解释器路径。
但是你的文件实际是:
#!/bin/bash\r
其中:
\r= Windows 回车符(CR,ASCII 13)\n= Linux 换行符(LF,ASCII 10)
所以 Linux 看到的解释器变成:
/bin/bash^M
它会尝试寻找:
/bin/bash^M
当然不存在,于是报:
错误的解释器: 没有那个文件或目录
解决方法 1:dos2unix(推荐)
安装:
Debian/Ubuntu:
sudo apt install dos2unix
转换:
dos2unix install.sh
然后:
./install.sh
即可。
解决方法 2:使用 sed
不安装工具:
sed -i 's/\r$//' install.sh
检查:
./install.sh
解决方法 3:vim 修改
打开:
vim install.sh
查看文件格式:
:set ff?
如果显示:
fileformat=dos
说明是 Windows 格式。
修改:
:set ff=unix
保存:
:wq
解决方法 4:重新生成文件
如果这个脚本来自 Windows:
例如:
Windows → Git → Linux
建议 Git 配置:
Linux 下:
git config --global core.autocrlf false
或者:
git config --global core.autocrlf input
这样 checkout 到 Linux 时保持 LF。
如何确认是否有 CRLF?
执行:
file install.sh
如果看到:
install.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
说明就是这个问题。
也可以:
cat -A install.sh | head
看到:
#!/bin/bash^M$
其中:
^M
就是 Windows 回车符。
额外建议
以后在 Linux 下写 shell:
文件第一行:
#!/usr/bin/env bash
比:
#!/bin/bash
更通用,因为 bash 可能安装在:
/usr/local/bin/bash
或者其他路径。
例如:
#!/usr/bin/env bashecho "hello"
然后:
chmod +x install.sh
./install.sh
即可。