问题描述
我想执行一个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
是carriage 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
[^M
型Ctrl
+ v
+ m
]
第六种方案
您还可以使用gedit删除不需要的字符。在File菜单下,选择Save As并设置行结束类型unix /Linux。
第七种方案
问题是你用Dos编辑的!
用vi打开你的文件然后用以下命令设置unix:
:set ff=unix
:wq
一切都很好