2009-02-06 73 views
6

有人可以帮助解释如下:的Bash脚本 - shell命令输出重定向

如果键入:

a=`ls -l` 

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

但如果我尝试:

a=`sh ./somefile` 

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

我期望的是shell试图执行脚本'somefile'的结果操作存储在变量中。

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

谢谢。

编辑:

只是为了澄清,剧本 'somefile' 可能会或可能不存在。如果存在,那么我希望脚本的输出存储在'a'中。如果不是,我想要在'a'中存储错误消息“no such file or dir”

回答

15

我认为shell可能会附加到/ dev/tty,但我可能是错的。你为什么不只是设置执行的脚本的权限和使用:如果你想捕捉标准错误标准输出的,只是使用

a=`./somefile` 

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))”)。

+0

它不是关于权限...我想要将错误消息或返回值存储在变量中。 – 2009-02-06 07:37:27

+0

我在说的是,你不需要运行sh来运行脚本(如果你这样做,sh会在输出上加上自己的防火墙)。只需直接运行脚本,为此,您需要'chmod + x'它。 – paxdiablo 2009-02-06 07:41:54

+0

请尝试以下操作:“chmod u + x somefile; a =`。/ somefile`“,然后看看设置的是什么 – paxdiablo 2009-02-06 07:44:10

5

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

a=$(sh ./somefile) 

如果还是不行,请检查是否somefile实际上不是标准错误“荷兰国际集团。

2

您是对的,./somefile的标准输出存储在变量a中。不过,我假设某些文件输出为stderr。您可以在./somefile之后直接通过2>&1重定向。