无法执行 .sh 文件:/bin/bash^M: bad interpreter

use*_*062 167 command-line bash scripts

我想执行一个shell脚本:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh
Run Code Online (Sandbox Code Playgroud)

我尝试执行标准程序,但出现此错误:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我是作为组root下的用户这样做的root

这是否意味着该文件没有root用户的正确权限?

Gil*_*il' 287

这不是权限问题,您没有收到有关权限的消息

/bin/bash^M: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

该脚本表明它必须由位于 的 shell 执行/bin/bash^M。没有这样的文件:它被称为/bin/bash.

^M是一个回车符。Linux 使用换行符来标记一行的结束,而 Windows 使用两个字符的序列 CR LF。您的文件具有 Windows 行结尾,这让 Linux 感到困惑。

删除虚假的 CR 字符。您可以使用以下命令执行此操作:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Run Code Online (Sandbox Code Playgroud)

  • 或者安装并使用`dos2unix` 程序。 (25认同)
  • 谢谢你,到目前为止我找到的所有其他答案都没有帮助。这个做到了! (5认同)
  • 在 gedit 中打开它,然后另存为,然后选择“行尾:Unix/Linux” (2认同)

ort*_*ang 36

在 vim 中,您也可以使用:set ff=unix然后保存文件,或:set ff=dos再次获得 DOS 格式。


Byt*_*der 31

您的文件具有DOS/Windows 样式的行尾 (CR LF),但在类 Unix 系统上,只有LF控制字符用作换行符。

附加的CR控制字符显示为^M在您的输出中编码。运行时也可以看到cat -A create_mgw_3shelf_6xIPNI1P.sh

要将行尾从 DOS/Windows 样式转换为 Unix 样式,有一个名为dos2unix. 您使用以下方法安装它:

sudo apt-get install dos2unix
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下两种方式简单地转换文件的行尾

dos2unix FILENAME
unix2dos FILENAME
Run Code Online (Sandbox Code Playgroud)

在您的情况下,只需在下面运行此命令,脚本文件将就地转换:

dos2unix create_mgw_3shelf_6xIPNI1P.sh
Run Code Online (Sandbox Code Playgroud)

之后 Bash 应该能够正确解释文件。

  • 谢谢,dos2unix 也可以通过 brew 用于 macOS。 (2认同)

小智 12

问题是你用 Dos 编辑!

使用 vi 打开您的文件,然后使用以下命令设置 unix:

:set ff=unix
:wq
Run Code Online (Sandbox Code Playgroud)

一切都很好


小智 5

vi <your script>

那么:set list;它将显示脚本中的任何特殊字符。

然后替换字符:

:%s/^M//gc [输入^MCtrl+ v+ m]


小智 5

正如其他答案中所解释的,这是一个格式问题。因此,答案是将格式从 DOS 更改为 Unix 样式的行尾。这是“就地”修复文件的另一种简单方法

fromdos file
Run Code Online (Sandbox Code Playgroud)

它在包中可用tofrodos

sudo apt-get install tofrodos
Run Code Online (Sandbox Code Playgroud)