运行 shell 脚本时提示如下错误:
/bin/sh^M: bad interpreter: No such file or directory
错误通常是因为文件在 Windows 系统上被创建或编辑,然后在 Linux 或 Unix 系统上执行时出现的问题。这里的 ^M 实际上是 Windows 下的换行符(Carriage Return,CR,\r )在 Linux/Unix 下的显示。
Linux/Unix 系统使用 Line Feed(LF,\n )作为换行符,而 Windows 系统使用 Carriage Return Line Feed(CRLF,\r\n )作为换行符。当你在 Windows 系统上编辑脚本文件,并将其转移到 Linux/Unix 系统上执行时,可能会出现这个问题。
要解决这个问题,你可以使用以下几种方法之一:
- 在 Linux/Unix 系统上使用
dos2unix 命令转换文件:
如果你的 Linux/Unix 系统上安装了 dos2unix 工具,你可以使用这个命令将文件的换行符从 CRLF 转换为 LF:
dos2unix filename
- 使用
sed 命令删除 \r :
如果你的系统上没有 dos2unix ,你也可以使用 sed 命令来删除 \r :
sed -i 's/\r$//' filename
- 在文本编辑器中设置正确的换行符:
如果你在 Windows 系统上编辑文件,确保你的文本编辑器设置为使用 Unix 风格的换行符(LF),而不是 Windows 风格的换行符(CRLF)。许多现代文本编辑器,如 Notepad++、VS Code、Sublime Text 等,都支持这一设置。
在 Linux 上可使用 Vi/Vim 转换:
#查看文件格式:
:set ff 或 :set fileformat
#可以看到如下信息:
fileformat=dos
#转换为 Unix 格式:
:set ff=unix 或 :set fileformat=unix
#保存并退出
:wq
- 使用 Git 进行自动转换:
如果你是通过 Git 在不同系统之间传输文件,你可以在 Git 配置中设置 core.autocrlf 选项,让 Git 在检出和提交时自动转换换行符:
git config --global core.autocrlf true
注意:在修改文件之前,最好先备份原始文件,以防万一。
|