阡陌 发表于 2024-2-23 09:54:37

Linux shell: /bin/sh^M: bad interpreter: No such file or directory


运行 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 系统上执行时,可能会出现这个问题。

要解决这个问题,你可以使用以下几种方法之一:

1. **在 Linux/Unix 系统上使用 `dos2unix` 命令转换文件**:

如果你的 Linux/Unix 系统上安装了 `dos2unix` 工具,你可以使用这个命令将文件的换行符从 CRLF 转换为 LF:

```bash
dos2unix filename
```

2. **使用 `sed` 命令删除 `\r`**:

如果你的系统上没有 `dos2unix`,你也可以使用 `sed` 命令来删除 `\r`:

```bash
sed -i 's/\r$//' filename
```

3. **在文本编辑器中设置正确的换行符**:

如果你在 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
```

4. **使用 Git 进行自动转换**:

如果你是通过 Git 在不同系统之间传输文件,你可以在 Git 配置中设置 `core.autocrlf` 选项,让 Git 在检出和提交时自动转换换行符:

```bash
git config --global core.autocrlf true
```

注意:在修改文件之前,最好先备份原始文件,以防万一。


页: [1]
查看完整版本: Linux shell: /bin/sh^M: bad interpreter: No such file or directory