当前位置: 首页>>技术教程>>正文


无法执行.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

^Mcarriage return character。 Linux使用line feed character标记行的结尾,而Windows使用two-character序列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-like系统上,只有LF控制字符用作换行符。

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

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

sudo apt-get install dos2unix

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

dos2unix FILENAME
unix2dos FILENAME

在您的情况下,只需在下面运行此命令,脚本文件将被转换为in-place:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

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

第四种方案

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

fromdos file

它包含在tofrodos包中:

sudo apt-get install tofrodos

第五种方案

vi <your script>

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

然后替换角色:

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

第六种方案

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

第七种方案

问题是你用Dos编辑的!

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

:set ff=unix
:wq

一切都很好

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1184.html,未经允许,请勿转载。