无法执行.sh文件:/ bin / bash ^ M:错误的解释器

我想执行一个shell脚本:

-rwxr-x--x 1 root root 17234 Jun 6 18:31 create_mgw_3shelf_6xIPNI1P.sh 

我试图做一个标准的程序,但我收到了这个错误:

 ./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** 

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

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

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

 /bin/bash^M: bad interpreter: No such file or directory 

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

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

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

 sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh 

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

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

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

要将行结尾从DOS / Windows样式转换为Unix样式,有一个名为dos2unix的工具。 你用它安装它:

 sudo apt-get install dos2unix 

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

 dos2unix FILENAME unix2dos FILENAME 

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

 dos2unix create_mgw_3shelf_6xIPNI1P.sh 

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

如其他答案中所述,这是格式问题。 所以,答案是将格式从DOS更改为Unix样式行结尾。 这是另一种简单的方法来“修复”文件

 fromdos file 

它有tofrodos包装:

 sudo apt-get install tofrodos 

vi

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

然后替换角色:

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

您还可以使用gedit删除不需要的字符。 在File菜单下,选择Save As并设置行结束类型unix / Linux。

问题是你用Dos编辑的!

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

 :set ff=unix :wq 

一切都很好