我们所拥有的是一组命令,包括要执行的脚本文件,一个可以执行的命令字符串。我们希望执行这些命令并将stderr输出存储到一个变量中(比如"err"),并将stderr和stdout的组合输出存储到另一个变量中("combined")。
。
#!/bin/bash
cmds="<cmd1>; <cmd2>; <cmd3>;"
<cmd4>;
<cmd5>;
<cmd6>;
<cmd7>;
eval $cmds;
./myscript.sh
err=<some magic>
combined=<some magic>
因此,变量$err
应该包含所有错误,而$combined
应该包含命令的组合输出,按照命令执行的顺序。
您可以将输出和错误写入单独的文件,最后读取它们并放入变量。
对于收集输出使用foo >>outputs.file
,对于错误使用foo 2>>errors.file
,因此命令将如下所示foo >>outputs.file 2>>errors.file
foo
是您的命令,>>
表示追加到文件。如果您使用单个>
,它将在写入文件之前截断文件。
和将文件包含在变量中使用myvar=$(cat outputs.file)
. 等号
#!/bin/bash
cmds="<cmd1>; <cmd2>; <cmd3>;"
$(
exec 3>"combined.log" 2> >(tee "err.log" >&3) 1> >(tee "out.log" >&3)
<cmd4>;
<cmd5>;
<cmd6>;
<cmd7>;
eval $cmds;
./myscript.sh
)
out=$(cat "out.log")
err=$(cat "err.log")
combined=$(cat "combined.log")
echo -e "OUT :: nn$out nn"
echo -e "ERR :: nn$err nn"
echo -e "COMB :: nn$combined nn"
3>"combined.log"
行将流3设置为文件combined.log
。这些命令是在子shell中执行的,在子shell中,我们将stderr和stdout"tee"到单独的文件中,并最终将所有这些输出重定向到fd 3。