我在我的一个ubuntu虚拟机中编写了一个sh脚本,但是当我尝试在其他虚拟机中运行它时,它不起作用。两个VM应该是相同的。使用bash --version
,两个虚拟机都回复:
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
使用lsb_release -a
,两者都回复:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.3 LTS
Release: 14.04
Codename: trusty
我的security_steps.sh
脚本如下所示:
#!/bin/sh
set -e
if ! [ -f svn_up_action.sh ]; then
echo "svn_up_action.sh is missing. Please make sure it is in the same directory as this script."
exit
fi
当我执行:sudo sh security_steps.sh
时,控制台错误:
: not foundeps.sh: 6: security_steps.sh:
security_steps.sh: 7: set: Illegal option -
我怎样才能弄清楚非工作shell的VM会发生什么?我觉得贝壳有点不同。感谢您的帮助!
答案 0 :(得分:13)
这几乎肯定意味着你的文件有DOS换行符 - 因此,最后隐藏CR字符。
因此,set -e
变为set -e$'\r'
(使用特定于bash的语法来表示CR字符),这不是一个有效的选项。
这也解释了: not found
,因为CR会将光标重置为行的开头,通过使sh: commandname: not found
代替操作来截断commandname
形式的错误消息将光标移动到行的开头。
答案 1 :(得分:6)
我在Windows上运行它时通过* .sh文件抛出了这个(通过GitBash)。
我必须将行结尾更改为UNIX / OSX格式。
答案 2 :(得分:0)
我遇到了同样的错误,
后来我发现这些增加是因为我的shell脚本文件从Windows机器移到了Linux机器(可能存在格式化或编码错误的可能性)。
因此,我已经在Linux机器本身中创建了该文档。它解决了这个问题。
此“五月”帮助不大,我发布此消息是因为它对我有用。
答案 3 :(得分:0)
在 Windows 中:
choco install dos2unix
dos2unix file.sh
在 Linux 中:
sudo apt install dos2unix
dos2unix file.sh
dos2unix 将文件转换为Unix类型。
执行完此操作后,尝试再次运行该应用程序或文件。
答案 4 :(得分:0)
如果您因为在 Windows 机器上接触文件而遇到此问题,Notepad++ 就是您的朋友。
检查
查看 > 显示符号 > 显示所有字符
寻找 CR
LF
行结尾,而不是 LF
行结尾!
解决
搜索 > 替换 (Ctrl+H)
确保搜索模式设置为 Extended
查找 \r\n
并替换为 \n