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

car*_*onn 383 bash

我正在学习本教程,学习bash脚本,为我自动完成一些任务.我正在使用putty连接到服务器.

该脚本位于.../Documents/LOG:

#!/bin/bash
# My first script
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)

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

chmod 755 my_script
Run Code Online (Sandbox Code Playgroud)

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

一些类似的问题想看到这些,所以我认为它们可能有所帮助:

which bash
Run Code Online (Sandbox Code Playgroud)

/斌/庆典

echo $PATH
Run Code Online (Sandbox Code Playgroud)

在/ usr/local/sbin中:在/ usr/local/bin目录:/ usr/sbin目录:在/ usr/bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr/bin中/ MH

我尝试添加当前目录PATH,但这不起作用..

cow*_*wls 513

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

尝试dos2unix 在脚本上运行:

http://dos2unix.sourceforge.net/

或者只是使用vi和测试在Unix env中重写脚本.

Unix使用不同的行结尾,因此无法读取您在Windows上创建的文件.因此它将^ M视为非法角色.

如果要在Windows上编写文件然后移植,请确保将编辑器设置为以UNIX格式创建文件.

在屏幕右下方的notepad ++中,它会告诉您文档格式.默认情况下,它会说Dos\Windows.要改变它去

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

  • 您也可以右键单击右下角的Dos\Windows文本,然后将其更改为unix. (18认同)
  • 如果你使用 Sublime Text 3 编辑器,你可以通过选择`View->Line Endings->Unix` 将行结尾从 Windows 转换为 Linux 格式,然后使用 `Ctrl+S` 保存你的脚本 (5认同)
  • 为这种不太可能的解决方案+1!我正在使用UltraEdit.要实现相同目的,请选择File - > Conversions - > DOS to Unix (3认同)
  • 在 VSCode 下,您可以将右下角的换行选项从 CRLF 更改为 LF,以实现与本文中相同的效果。 (3认同)

Niv*_*eph 443

在终端中运行以下命令

sed -i -e 's/\r$//' scriptname.sh
Run Code Online (Sandbox Code Playgroud)

然后试试

./scriptname.sh
Run Code Online (Sandbox Code Playgroud)

它应该工作.

  • 这是什么巫术?!!! (14认同)
  • 2018年最佳答案! (5认同)
  • @Robert Molina,Windows 除了在行尾添加 \n 之外,还添加了一个回车符。此命令只是通过使用 linux 流编辑命令 (sed) 用 \r 替换空字符串来删除它。 (5认同)
  • 我的脚本是一个.php脚本,这解决了这个问题. (3认同)
  • 也为我工作。脚本是在OS X上用Sublime编写的。 (2认同)
  • 如果这不起作用,请尝试`sed -i -e'/ ^ M $ //'scriptname.sh`.(按Ctrl + V Ctrl + M插入'^ M`.) (2认同)
  • 处理我移植到 Windows 并返回的 bash 脚本。所有冰雹sed! (2认同)
  • 这对我不起作用,包括。但是,原始答案有一个对我有用的解决方案:在Vim中打开文件并运行以下命令,然后再保存::set fileformat = unix在名为SO的问题下列出了shell脚本是否对编码和行尾敏感?为我工作。 (2认同)
  • 在没有安装 dos2unix 的 docker 容器上工作的奖金。虽然我无法覆盖我的脚本,所以我的看起来像`cat scriptname.sh | sed -e 's/\r$//' > fixedscriptname.sh` (2认同)
  • 如果有帮助,我使用 sed -i -e 's/\r$//' *.sh 转换了我所有的 sh 文件以使它们工作 (2认同)
  • 这个答案解释的是您没有使用 UNIX 结束行。检查接受的答案。如果您使用的是 Windows(例如 Notepad++),请检查编辑/转换结束行/Unix 格式。 (2认同)

Mar*_*mpa 119

如果您在Windows或Mac上使用Sublime Text来编辑脚本:

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

在此输入图像描述


Sto*_*dIM 45

这是由在Windows中编辑文件以及在unix中导入和执行引起的.

dos2unix -k -o filename 应该做的伎俩.

  • 对不起,它对我不起作用. (2认同)

Uri*_*rik 35

在notepad ++中,您可以通过按键专门为文件设置它

编辑 - > EOL转换 - > UNIX/OSX格式

在此输入图像描述

  • 那行得通..谢谢 (2认同)

Md.*_*man 11

问题是dos线结束.以下将转换为unix

dos2unix file_name
Run Code Online (Sandbox Code Playgroud)

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

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

$sed -i -e 's/\r$//' your_script.sh
Run Code Online (Sandbox Code Playgroud)


kal*_*ari 10

您的文件有Windows行结尾,这让Linux感到困惑.

删除虚假的CR字符.您可以使用以下命令执行此操作:

 $ sed -i -e 's/\r$//' setup.sh
Run Code Online (Sandbox Code Playgroud)


NWR*_*ond 6

我能够通过在Gedit 中打开脚本并使用正确的Line Ending选项保存它来解决这个问题:

文件 > 另存为...

Save As提示的左下角,有字符编码和行尾的下拉菜单。将 Line Ending 从 更改WindowsUnix/Linux然后保存。

gedit“另存为”提示]


Chr*_*ras 5

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

Eclipse更改文件编码

或更改New text file line delimiterOther: UnixWindow > Preferences > General > Workspace面板:

Eclipse工作区设置