我正在通过本教程学习如何学习bash脚本来为我自动化一些任务。我正在用Putty连接服务器。
脚本位于.../Documents/LOG中,是:
1 2 3
| #!/bin/bash
# My first script
echo"Hello World!" |
我为读/写/执行权限执行了以下操作
然后,当我进入./my_script时,我得到了标题中给出的错误。
一些类似的问题希望看到这些,因此我认为它们可能有助于:
/bin/bash
和
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/bin/mh
我试图将当前目录添加到PATH中,但这不起作用。
- 你是如何创建文件的?例如,哪个编辑器/操作系统
- 我使用记事本+在Windows中创建了该文件,并使用winscp将该文件复制到服务器上。我知道这不是做事情的理想方式
- 看我的答案,这很可能是问题所在
我在Windowsenv中创建脚本,然后移植到Unix环境中运行时看到了这个问题。
尝试在脚本上运行dos2unix:
http://dos2unix.sourceforge.net/
或者使用vi和test在Unix环境中重写脚本。
Unix使用不同的行尾,因此无法读取您在Windows上创建的文件。因此,它将^ m视为非法字符。
如果您想在Windows上写入一个文件,然后通过端口连接,请确保您的编辑器设置为以UNIX格式创建文件。
在屏幕右下角的记事本++中,它告诉您文档格式。默认情况下,它将称为Dos\Windows。要更改,请转到
- 设置->首选项
- 新建文档/默认目录选项卡
- 选择Unix格式并关闭
- 创建新文档
- 你到底是怎么发现这个的?
- 您也可以右键单击右下角的DOSWindows文本,然后在那里将其更改为Unix。
- +一个不太可能的解决方案!!我正在使用超级编辑。要在这里实现相同的效果,请选择文件->转换->DOS到Unix
- 哇…我也遇到了同样的问题。我很幸运我的脚本只有10行代码。所以,我把整件事打出来并保存下来。巴姆!它起作用了。谢谢你,考尔斯。
- 我在记事本中打开脚本并粘贴到Putty Shell中,然后保存它。现在一切都很好。谢谢你的回答。
- 链接未激活。
- 我也面临同样的问题。我已经用windows env编写了这个脚本并复制到了Linux机器上。在Linux机器中重写脚本之后,错误就消失了
- 如果使用Sublime Text 3编辑器,可以通过选择View->Line Endings->Unix将行尾从Windows转换为Linux格式,然后用Ctrl+S保存脚本。
- 非常简单,只需使用gedit并执行Save As...,然后将行尾更改为Unix/Linux。
- 你救了我的命!!!!!!!
- 在记事本++中更改设置比多年后重新学习vi要容易得多!-)
- 或者您也可以在vim中的文件中键入以下命令:set ff=unix
在终端中运行以下命令
1 2
| sed -i -e 's/
$//' scriptname.sh |
然后尝试
它应该起作用。
- 我的脚本是.php脚本,这解决了这个问题。
- 也为我工作。脚本是用崇高的语言写在OSX上的。
- 我彻底搞砸了.sh脚本从Windows上传,主管给了我一个很严重的错误。谢谢你!
- 这对我有用。这是因为伪CR字符。
- 如果这不起作用,请尝试sed -i -e 's/^M$//' scriptname.sh。(按ctrl+v ctrl+m插入该^M。)
- 这是什么巫术??!!!!
- @尼文:为我工作。
- 我把我的bash脚本移植到窗口和后面。都欢呼了!
- 这应该是正确的答案。
- 这对我不起作用,包括。但是,最初的答案有一个对我有用的解决方案:在vim中打开文件,并在保存之前运行以下命令::set fileformat=unix,列在所谓的问题"shell脚本对编码和行尾敏感吗?"为我工作。
- 2018年最佳答案!
- 也为我工作!
- 当然,我的首选答案促使E查找您应用于SED的标志。多好的教育啊!!!!
- 在没有安装dos2unix的Docker容器上工作的额外奖励。虽然我不能在我的情况下覆盖脚本,所以我的看起来像cat scriptname.sh | sed -e 's/
$//' > fixedscriptname.sh
- 这到底有什么用?真不敢相信它起作用了。
如果在Windows或Mac上使用高级文本编辑脚本:
单击View > Line Endings > Unix并再次保存文件。
- 修好了,谢谢
- 我最喜欢的答案。没有其他东西能轻易做到这一点。
- 它奏效了。但我能知道执行这个动作的原因吗?
- 修好了,谢谢
这是由在Windows中编辑文件以及在Unix中导入和执行造成的。
dos2unix -k -o filename应该能做到这一点。
在记事本++中,您可以通过按
编辑——>EOL转换——>Unix/OSX格式
DOS行结束时出现问题。下面将对其进行unix转换
注意:您可能需要先安装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 |
- 当我无法让脚本在Windows文件系统上运行时,这就是我需要的魔力。
对于Eclipse用户,您可以直接从菜单File > Convert Line Delimiters To > Unix (LF,
, 0Α, ?)更改文件编码:
或者在Window > Preferences > General > Workspace面板上将New text file line delimiter改为Other: Unix:
- 文件>将行分隔符转换为行分隔符,但窗口>首选项>常规>工作区>Unix似乎没有帮助。
- @Panuhaaramo该设置适用于所有新创建的文件。如果您已经创建了一个文件,那么您必须像在第一个屏幕截图中那样转换它。
我可以通过在gedit中打开脚本并使用适当的Line Ending选项保存来解决这个问题:
File > Save As...
在Save As提示的左下角,有字符编码和行尾的下拉菜单。将从Windows结束的行改为Unix/Linux结束,然后保存。
Atom有一个内置的行尾选择器包
更多详细信息请访问:https://github.com/atom/line-ending-selector
我同时在Windows和Mac/Linux上进行开发,通过像在Windows中那样简单地运行脚本,我避免了这个^m错误:
$ php ./my_script
不需要更改行尾。