-bash:/my_script:/bin/bash^m:错误的解释器:没有这样的文件或目录

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

本问题已经有最佳答案,请猛点这里访问。

我正在通过本教程学习如何学习bash脚本来为我自动化一些任务。我正在用Putty连接服务器。

脚本位于.../Documents/LOG中,是:

1
2
3
#!/bin/bash
# My first script
echo"Hello World!"

我为读/写/执行权限执行了以下操作

1
chmod 755 my_script

然后,当我进入./my_script时,我得到了标题中给出的错误。

一些类似的问题希望看到这些,因此我认为它们可能有助于:

1
which bash

/bin/bash

1
echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/bin/mh

我试图将当前目录添加到PATH中,但这不起作用。


我在Windowsenv中创建脚本,然后移植到Unix环境中运行时看到了这个问题。

尝试在脚本上运行dos2unix

http://dos2unix.sourceforge.net/

或者使用vi和test在Unix环境中重写脚本。

Unix使用不同的行尾,因此无法读取您在Windows上创建的文件。因此,它将^ m视为非法字符。

如果您想在Windows上写入一个文件,然后通过端口连接,请确保您的编辑器设置为以UNIX格式创建文件。

在屏幕右下角的记事本++中,它告诉您文档格式。默认情况下,它将称为Dos\Windows。要更改,请转到

  • 设置->首选项
  • 新建文档/默认目录选项卡
  • 选择Unix格式并关闭
  • 创建新文档


在终端中运行以下命令

1
2
sed -i -e 's/
$//'
scriptname.sh

然后尝试

1
./scriptname.sh

它应该起作用。


如果在Windows或Mac上使用高级文本编辑脚本:

单击View > Line Endings > Unix并再次保存文件。

enter image description here


这是由在Windows中编辑文件以及在Unix中导入和执行造成的。

dos2unix -k -o filename应该能做到这一点。


在记事本++中,您可以通过按

编辑——>EOL转换——>Unix/OSX格式

enter image description here


DOS行结束时出现问题。下面将对其进行unix转换

1
dos2unix file_name

注意:您可能需要先安装dos2unix和yum install dos2unix

另一种方法是使用sed命令搜索并将DOS行结束字符替换为unix格式:

1
2
$sed -i -e 's/
$//'
your_script.sh


您的文件有Windows行尾,这会混淆Linux。

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

1
2
 $ sed -i -e 's/
$//'
setup.sh


对于Eclipse用户,您可以直接从菜单File > Convert Line Delimiters To > Unix (LF,
, 0Α, ?)
更改文件编码:

Eclipse change file encoding

或者在Window > Preferences > General > Workspace面板上将New text file line delimiter改为Other: Unix

Eclipse workspace settings


我可以通过在gedit中打开脚本并使用适当的Line Ending选项保存来解决这个问题:

File > Save As...

Save As提示的左下角,有字符编码和行尾的下拉菜单。将从Windows结束的行改为Unix/Linux结束,然后保存。

gedit


Atom有一个内置的行尾选择器包

更多详细信息请访问:https://github.com/atom/line-ending-selector


我同时在Windows和Mac/Linux上进行开发,通过像在Windows中那样简单地运行脚本,我避免了这个^m错误:

$ php ./my_script

不需要更改行尾。