598

我正在通过本教程学习bash 脚本来为我自动执行一些任务。我正在使用腻子连接到服务器。

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

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

我执行了以下read/write/execute permissions

chmod 755 my_script

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

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

which bash

/bin/bash

echo $PATH

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

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

4

11 回答 11

822

在终端中运行以下命令

sed -i -e 's/\r$//' scriptname.sh

然后尝试

./scriptname.sh

它应该工作。

于 2015-04-20T12:13:18.173 回答
771

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

尝试dos2unix 在脚本上运行:

http://dos2unix.sourceforge.net/

或者只是在你的 Unix 环境中使用vi和测试重写脚本。

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

如果您想在 Windows 上编写文件然后移植过来,请确保您的编辑器设置为以 UNIX 格式创建文件。

在屏幕右下角的 notepad++ 中,它会告诉您文档格式。默认情况下,它会说Dos\Windows. 要更改它,请转到

  • 设置->首选项
  • 新文档/默认目录选项卡
  • 选择格式为 unix 并关闭
  • 创建一个新文档
于 2013-01-08T16:07:24.690 回答
150

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

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

在此处输入图像描述

于 2014-04-21T17:26:34.910 回答
57

这是由于在 windows 中编辑文件并在 unix 中导入和执行造成的。

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

于 2013-08-13T11:17:13.320 回答
56

在记事本++中,您可以通过按专门为文件设置它

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

在此处输入图像描述

于 2014-06-03T10:54:40.113 回答
18

问题在于dos行结束。以下将其转换为 unix

dos2unix file_name

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

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

$sed -i -e 's/\r$//' your_script.sh
于 2016-08-31T11:10:18.427 回答
15

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

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

 $ sed -i -e 's/\r$//' setup.sh
于 2016-05-19T10:16:14.260 回答
7

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

Eclipse 更改文件编码

或将面板更改New text file line delimiter为:Other: UnixWindow > Preferences > General > Workspace

Eclipse 工作区设置

于 2017-05-01T09:21:47.203 回答
6

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

文件 > 另存为...

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

编辑

于 2016-05-26T19:10:41.337 回答
1

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

更多细节在这里:https ://github.com/atom/line-ending-selector

于 2017-06-15T20:52:09.647 回答
0

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

$ php ./my_script

无需更改行尾。

于 2016-11-04T17:32:22.403 回答