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


107

我想执行一个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**

这是什么意思?我是rootroot小组的用户。

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

Answers:


182

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

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

该脚本指示必须由位于的外壳执行该脚本/bin/bash^M。没有这样的文件:它称为/bin/bash

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

删除伪造的CR字符。您可以使用以下命令进行操作:

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

22
或安装并使用该dos2unix程序。
argentpepper 2013年

4
谢谢您,到目前为止,Ive找到的所有其他答案都没有帮助。这一个做到了!
qodeninja 2014年

不必是Windows,在将脚本从OS X复制到Ubuntu后,我得到了类似的消息... dos2unix在这种情况下效果很好,而用'\ r'替换任何内容都会更糟,因为没有'\文件中的n个字符。
迈克尔

1
@Michael macOS使用,\n因为它是Unix。该脚本可能来自较早的Mac OS版本?sed -i -e 's/\r$/\n/' script.sh在这种情况下,您可以运行。
wjandrea '16

1
在gedit中将其打开,然后另存为,然后选择“行尾:Unix / Linux”
Mattmon '17

23

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


这个为我做到了,谢谢
bunkerdive

19

您的文件具有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应该能够正确解释文件。


1
谢谢,dos2unix也可以通过brew用于macOS。
Muhammad Annaqeeb '18年

5

您使用Dos编辑的问题专家!

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

:set ff=unix
:wq

一切都很好


4

vi <your script>

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

然后替换字符:

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


参见上述有关使用:fileformat的答案,IMHO比全局替换更适合处理此问题。此外,请参见stackoverflow.com/questions/14609779/…了解如何自动处理的想法
qneill

4

如其他答案所述,这是格式问题。因此,答案是将格式从DOS更改为Unix样式的行尾。这是“固定”文件的另一种简单方法

fromdos file

它在包装中可用tofrodos

sudo apt-get install tofrodos

2

您也可以使用gedit删除不需要的字符。在“文件”菜单下,选择“另存为”,然后设置行尾类型为Unix / Linux。


为此+1,因为它有助于我处理MacOS的行尾。
Bobble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.