当你将在Windows平台写的shell脚本上传到 Linux 系统执行 Shell 脚本时,可能会遇到如下错误提示:
-bash: ./ci.sh: /bin/bash^M: bad interpreter: No such file or directory
这种错误通常是由于脚本文件中存在 Windows 系统的回车符 ^M
导致的,本文将会带你从底层原理来分析原因和解决办法。
文章目录
- 原因
- 解决方法
- 方法一:使用 `sed` 命令删除回车符
- 方法二:使用 `dos2unix` 工具
原因
- 在 Windows 系统中,文本文件的换行符是
\r\n
(回车 + 换行)。 - 而 Linux 系统中,文本文件的换行符仅是
\n
(换行)。 - 当你在 Windows 下创建或编辑脚本文件,然后将其上传到 Linux 服务器后,脚本中残留的
\r
(回车符)会导致解释器路径解析错误。
比如:
#!/bin/bash^M
Linux 会将整个路径(包括 ^M
)视为解释器,但该路径显然是无效的,因而报错。
解决方法
方法一:使用 sed
命令删除回车符
可以直接使用 sed
命令对文件进行修改,删除所有的 \r
符号:
sed -i 's/\r$//' ./ci.sh
解释:
-i
:直接修改文件。's/\r$//'
:表示替换掉行尾的\r
符号。./ci.sh
:是需要修复的脚本文件。
执行完后,再次运行脚本即可。
方法二:使用 dos2unix
工具
如果系统中安装了 dos2unix
工具,可以直接将 Windows 格式的文件转换为 Unix 格式:
dos2unix ./ci.sh
若未安装,可通过以下命令安装(以 CentOS 为例):
yum install -y dos2unix