Bash Scripting - shell命令输出重定向

时间:2009-02-06 07:11:42

标签: bash shell scripting

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

如果我输入:

a=`ls -l`

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

但如果我尝试:

a=`sh ./somefile`

结果输出到shell(stdout)而不是变量a

我所期望的是shell尝试执行存储在变量中的脚本“somefile”的结果操作。

请指出我的理解和可能的方法有什么问题。

感谢。

编辑:

为了澄清,脚本“somefile”可能存在也可能不存在。如果它存在,那么我希望脚本的输出存储在“a”中。如果没有,我想在“a

中存储错误消息“no such file or dir”

3 个答案:

答案 0 :(得分:15)

我认为因为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))”)。

答案 1 :(得分:5)

您可以尝试新的和改进的命令替换方法,使用$()而不是反引号。

a=$(sh ./somefile)

如果仍然无效,请检查 somefile 是否实际上不是 stderr

答案 2 :(得分:2)

你是对的,./somefile的标准输出存储在变量a中。但是,我假设某些文件输出到stderr。您可以在2>&1之后直接使用./somefile重定向该链接。