bash:如何将一组命令的输出存储在两个变量中,err,按照执行时的精确顺序组合



我们所拥有的是一组命令,包括要执行的脚本文件,一个可以执行的命令字符串。我们希望执行这些命令并将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。

最新更新