有人可以帮助解释以下内容:
如果我输入:
a=`ls -l`
然后ls命令的输出保存在变量a
但如果我尝试:
a=`sh ./somefile`
结果输出到shell(stdout
)而不是变量a
我所期望的是shell尝试执行存储在变量中的脚本“somefile
”的结果操作。
请指出我的理解和可能的方法有什么问题。
感谢。
编辑:
为了澄清,脚本“somefile
”可能存在也可能不存在。如果它存在,那么我希望脚本的输出存储在“a
”中。如果没有,我想在“a
”
答案 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
重定向该链接。