问题描述
在 Linux 系统上执行从 Windows 转移过来的 Shell 脚本时,可能会遇到类似以下的错误信息:
/bin/bash^M: bad interpreter: No such file or directory
或者:
bash: ./jfinal.sh: /bin/bash^M: bad interpreter: 没有那个文件或目录
原因分析
这个错误表明您的 Shell 脚本(如 jfinal.sh)中可能包含 Windows 风格的换行符(\r\n),而不是 Unix 风格的换行符(\n)。
这是因为您在 Windows 系统上编辑了该脚本,Windows 使用 CR+LF(回车+换行)作为行尾符,而 Linux/Unix 系统只使用 LF(换行)作为行尾符。
解决方案:使用 dos2unix 转换
您可以使用 dos2unix 命令来转换脚本中的换行符。在 Linux 系统上运行以下命令:
dos2unix jfinal.sh
这将把 jfinal.sh 脚本中的所有 Windows 风格换行符转换为 Unix 风格换行符。
安装 dos2unix
Debian/Ubuntu 系统
sudo apt-get install dos2unix
Red Hat/CentOS/Fedora 系统
sudo yum install dos2unix
或者(Fedora 及新版本的 RHEL/CentOS 8+):
sudo dnf install dos2unix
Arch Linux 系统
sudo pacman -S dos2unix
替代方案(无需安装额外工具)
使用 sed 命令
sed -i 's/
$//' jfinal.sh
使用 tr 命令
tr -d '
' < jfinal> jfinal_fixed.sh
mv jfinal_fixed.sh jfinal.sh
使用 vim 编辑器
vim jfinal.sh
:set ff=unix
:wq
验证转换结果
转换完成后,可以使用 file 命令验证文件格式:
file jfinal.sh
正确的输出应该是:
jfinal.sh: Bourne-Again shell script, ASCII text executable
如果仍然显示 with CRLF line terminators,则表示转换未成功。
批量转换多个文件
如果目录下有多個脚本需要转换,可以使用通配符批量处理:
dos2unix *.sh
或者递归转换整个目录:
find /path/to/scripts -name "*.sh" -exec dos2unix {} \;
总结
当从 Windows 转移 Shell 脚本到 Linux 系统时,务必注意换行符的差异。推荐安装 dos2unix 工具进行转换,它简单高效且不会损坏文件内容。如果无法安装额外工具,使用 sed 命令也是一个不错的替代方案。
换行符修复
Windows CRLF 与 Unix LF 差异导致脚本失败。
- dos2unix 转换
- sed 删除 CR

发表评论 取消回复