我想执行一个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用户没有正确的权限?

#1 楼

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

/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


评论


或安装并使用dos2unix程序。

– argentpepper
2013年6月6日22:56

谢谢你,到目前为止我发现的所有其他答案都没有帮助。这一个做到了!

–qodeninja
2014年6月9日23:39

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

–迈克尔
16 Sep 14 '17:39

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

– wjandrea
16/12/21在4:49



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

–马特蒙
17年11月27日在12:11

#2 楼

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

评论


这个为我做了,谢谢

–bunkerdive
15年8月6日在19:53

谢谢,为我工作@ortang

–mikoop
20年11月9日,1:19

#3 楼

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

评论


谢谢,dos2unix也可以通过brew用于macOS。

–穆罕默德·纳基布(Mohamed El-Nakib)
18-09-18在5:35

#4 楼

用Dos编辑问题!

用vi打开文件
,然后用以下方法设置unix:

:set ff=unix
:wq


很好

#5 楼

请执行vi <your script>

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

然后替换字符:

:%s/^M//gc [要键入^M,请按Ctrl + v + m]

评论


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

– qneill
17年8月11日在15:58



#6 楼

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

fromdos file


它在软件包tofrodos中可用:

sudo apt-get install tofrodos


#7 楼

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

评论


为此+1,因为它有助于我处理MacOS的行尾。

– Bobble
2014年4月3日在11:52