【问题标题】:"set: illegal option -" on one host but not the other“设置:非法选项 -” 在一台主机上,但不在另一台主机上
【发布时间】:2016-05-23 00:47:58
【问题描述】:

我在我的一个 ubuntu 虚拟机中编写了一个 sh 脚本,它运行良好,但是当我尝试在我的其他虚拟机中运行它时,它不起作用。两个虚拟机应该相同。使用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 -

我怎样才能弄清楚非工作外壳的虚拟机发生了什么?我觉得贝壳有点不同。感谢您的帮助!

【问题讨论】:

  • 不是 bash 脚本,因此不应将问题标记为 bash。 /bin/sh 是 POSIX sh,而不是 bash。
  • 另外,您可能的潜在问题是第一件事stackoverflow.com/tags/bash/info 的标签 wiki 告诉您在询问之前检查。
  • ...同样,bash --version 的输出与使用#!/bin/sh 而不是#!/bin/bash 的脚本完全无关
  • @CharlesDuffy 非常感谢您提供的链接!是的,每行末尾都有^M
  • @CharlesDuffy 是的,dos2unix 解决了我的问题。谢谢。

标签: linux shell ubuntu sh


【解决方案1】:

这几乎可以肯定意味着您的文件有 DOS 换行符 - 因此,最后隐藏的 CR 字符。

因此,set -e 变为 set -e$'\r'(使用 bash 特定的语法来表示 CR 字符),这不是一个有效的选项。

这也解释了: not found,因为 CR 会将光标重置到行首,通过将commandname 改为将光标移动到行首。

【讨论】:

  • 这是问题的基本解决方案,此答案应标记为已接受。我遇到了这个问题,花了大约 2 个小时才意识到在我的脚本上使用 VsCode 进行简单编辑就是将 CR 字符放在最后。
【解决方案2】:

我有 *.sh 文件在 Windows 上运行它时抛出了这个(通过 GitBash)。

我不得不将行尾更改为 UNIX/OSX 格式。

【讨论】:

  • 这和三个月前的答案是一样的,不是吗?
【解决方案3】:

我遇到了同样的错误,

后来我发现这些错误是因为我的 shell 脚本文件从 windows 机器移动到了 Linux 机器(可能会出现格式化或编码错误)。

所以我已经在 Linux 机器本身中创建了文档。它解决了这个问题。

这个“五月”帮助很少,我发布这个是因为它对我有用。

【讨论】:

    【解决方案4】:

    Windows中:

    choco install dos2unix
    dos2unix file.sh
    

    Linux 中:

    sudo apt install dos2unix
    dos2unix file.sh
    

    dos2unix 将文件转换为 Unix 类型。

    执行此操作后,尝试再次运行应用程序或文件。

    【讨论】:

      【解决方案5】:

      如果您因为在 Windows 机器上触摸文件而遇到此问题,Notepad++ 是您的朋友。

      检查
      查看 > 显示符号 > 显示所有字符
      寻找CRLF 行尾,而不是LF 行尾!

      求解
      搜索 > 替换 (Ctrl+H)
      确保搜索模式设置为Extended
      找到\r\n并替换为\n

      【讨论】:

        猜你喜欢
        • 2012-09-29
        • 2013-07-25
        • 1970-01-01
        • 2018-01-06
        • 2019-11-20
        • 1970-01-01
        • 2016-09-28
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多