有人可以帮忙解释以下内容:

如果输入:

a=`ls -l`

然后,将ls命令的输出保存在变量a

但是如果我尝试:
a=`sh ./somefile`

结果输出到 shell 程序(stdout),而不是变量a
我期望的是shell的结果操作试图执行要存储在变量中的脚本'somefile'。

请指出我的理解有什么问题以及执行此操作的可能方法。

谢谢。

编辑:

只是为了澄清,脚本“somefile”可能存在或可能不存在。如果存在,那么我希望脚本的输出存储在“a”中。如果没有,我希望将错误消息“没有这样的文件或目录”存储在“a”中

最佳答案

我认为是因为shell可能会将自身附加到/dev/tty,但我可能错了。您为什么不只对脚本设置执行权限并使用:

a=`./somefile`

如果要将stderr stdout捕获到a中,请使用:
a=`./somefile 2>&1`

要首先检查文件是否可执行:
if [[ -x ./somefile ]] ; then
    a=$(./somefile 2>&1)
else
    a="Couldn't find the darned thing."
fi

您会注意到我正在切换到$()方法,而不是反引号。我更喜欢$(),因为您可以嵌套它们(例如“a=$(expr 1 + $(expr 2 + 3))”)。

10-08 07:52