我正在尝试将bash命令的输出存储在变量中。我是shell脚本的新手,但到目前为止,我有以下内容:
#!/bin/sh
MOSTRECENTMOD="$(echo | ls -t | head -n1)"
echo "$MOSTRECENTMOD"
这在cygwin中运行得很好,但在Solaris上却没有。有任何想法吗?我正在使用Unix换行符。我尝试了很多东西,但它似乎没有用。
在Solaris上,它只输出:
$(echo | ls -t | head -n1)
跑步时。
谢谢。
答案 0 :(得分:4)
Solaris上的标准/bin/sh
非常严格地说是System V Bourne Shell。它绝对不是POSIX兼容的shell,并且不理解$(...)
符号(在许多其他差异中,或多或少的重要性)。这意味着继续使用/bin/sh
,您需要更改$(..)
表示法以使用反引号(这在内联Markdown中显示出一种痛苦 - 我尝试了各种顺序但没有成功:
`...`
或者,如果您的机器有/bin/bash
,请在shebang线上指定;否则,请指定支持/bin/ksh
表示法的$(...)
和许多其他有用的功能。
答案 1 :(得分:2)
我认为$( ... )
语法来自Bash,而非标准sh。使用反引号(`echo | ls -t | head -n1`
)或将#!/bin/sh
更改为#!/bin/bash
(假设您的系统中存在)。
答案 2 :(得分:0)
我认为你的问题是你有太多的引号。摆脱第一行的引号,它应该可以工作。
答案 3 :(得分:0)
由于传统/向上兼容性原因,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,因此不需要这样做。