"设置:非法选项 - "在一个主机上但不在另一个主机上

时间:2016-02-12 00:53:44

标签: linux shell ubuntu sh

我在我的一个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会发生什么?我觉得贝壳有点不同。感谢您的帮助!

5 个答案:

答案 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