【问题标题】:Simple shell script works in cygwin but not on solaris简单的 shell 脚本在 cygwin 中有效,但在 solaris 上无效
【发布时间】:2011-02-20 04:09:24
【问题描述】:

我正在尝试将 bash 命令的输出存储在一个变量中。我对 shell 脚本很陌生,但到目前为止,我有以下内容:

#!/bin/sh
MOSTRECENTMOD="$(echo | ls -t | head -n1)"
echo "$MOSTRECENTMOD"

这在 cygwin 中工作得很好,但在 Solaris 上却不行。有任何想法吗?我正在使用 Unix 换行符。我尝试了很多东西,但它似乎不起作用。

在 Solaris 上,它只输出:

$(echo | ls -t | head -n1)

运行时。

谢谢。

【问题讨论】:

  • 嗯,还有人在用Solaris?! :-)
  • @Franci:是的,还有人还在使用 Solaris。也有人使用其他非 Linux 的 Unix 变体,这些变体比 Solaris 更接近于僵化状态。

标签: shell unix scripting cygwin solaris


【解决方案1】:

Solaris 上的标准/bin/sh 是相当严格的System V Bourne Shell。它绝对不是 POSIX 兼容的 shell,并且不理解 $(...) 表示法(在许多其他差异中,或多或少重要)。这意味着要继续使用/bin/sh,您需要更改$(..) 表示法以使用反引号(在内联Markdown 中显示很痛苦 - 我尝试了各种序列但均未成功:

`...`

或者,如果您的机器有/bin/bash,请在 shebang 行上指定;否则,请指定/bin/ksh,它支持$(...) 表示法和许多其他有用的功能。

【讨论】:

    【解决方案2】:

    我相信$( ... ) 语法来自 Bash,而不是标准 sh。使用反引号 (`echo | ls -t | head -n1`) 或将 #!/bin/sh 更改为 #!/bin/bash(假设您的系统上存在)。

    【讨论】:

    • 因为您所说的(关于 $() 是特定于 bash 的)不正确。与乔纳森的答案比较,这是正确的。
    【解决方案3】:

    我认为你的问题是你有太多的引号。去掉第一行的引号,它应该可以工作。

    【讨论】:

    • 我认为这是一个 shell 问题(/bin/sh 中缺少 $( ... )),而不是引用问题。
    【解决方案4】:

    Solaris 10 和更早的 /bin/sh 不兼容 POSIX,因为旧版/向上兼容的原因。如果您想保持脚本不变,我建议您这样做,您需要切换到支持 posix $() 表示法的 shell,例如 /bin/ksh、/usr/xpg4/bin/sh 或 bash。

    例如:

    #!/bin/xpg4/bin/sh
    MOSTRECENTMOD="$(echo | ls -t | head -n1)"
    echo "$MOSTRECENTMOD"
    

    另请注意,Solaris 11 (Express) 有一个兼容的 /bin/sh,所以这不是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-13
      • 2012-04-02
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多