根据退出代码bash脚本将命令重定向到变量或文件?

Posted

技术标签:

【中文标题】根据退出代码bash脚本将命令重定向到变量或文件?【英文标题】:redirect command to a variable or a file based on its exit code bash script? 【发布时间】:2016-05-22 07:24:49 【问题描述】:

我想根据命令的退出代码将命令的标准错误或标准输出重定向到文件或变量。即,如果退出代码为零,那么我会将 stdout 重定向到文件,否则我将重定向到 stderr。

【问题讨论】:

【参考方案1】:

不幸的是,如果不执行两次命令,就无法同时捕获 stdout 和 stderr 并将它们存储在不同的变量中。相反,您必须将输出重定向到不同的临时文件,然后根据退出代码保留所需的文件。例如:

#Send the output to different files
dosomething >tempout 2>temperr

case $? in
    0)
        mv tempout outfile.txt
        rm temperr;;
    1)
        mv temperr outfile.txt
        rm tempout;;
    2)
        mv tempout outfile.txt
        cat temperr >> outfile.txt
        rm temperr;;
    3)
        var=$(cat tempout)
        rm tempout temperr
    #...etc
esac

应该做的工作。如果要将 stderr(或两者)发送到变量,请不要忘记完成 case 语句。

【讨论】:

我可以使用 /dev/null 代替一个临时文件,然后将其重定向到一个变量吗? 你的意思是将输出重定向到 /dev/null 然后以某种方式找到它吗?你无法做到这一点,一旦你向 /dev/null 发送了一些东西,你就会永远粉碎它,因此临时文件。【参考方案2】:

试试这样的:

a) 捕获输出:

OUT=`grep -c test myfile.txt`

b) 根据位于特殊变量$? 中的退出状态重定向(同时不做任何其他事情)环境变量OUT

if [ "$?" -eq 0 ];
then
    echo "succes with output=$OUT";
else
    echo "failure with output=$OUT";
fi

当然,您必须将第二部分完全放在第一部分之后,以便在$? 中保持正确的值。

如果输出太大;先重定向到一个临时文件,然后根据退出码重命名临时文件。

【讨论】:

我需要分别存储stderr和stdout,这样我就可以按照你在b)中提到的那样做,有什么办法吗? 你可以通过重定向到两个不同的临时文件来做到这一点。

以上是关于根据退出代码bash脚本将命令重定向到变量或文件?的主要内容,如果未能解决你的问题,请参考以下文章

linux脚本后台运行失败

Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)

将命令输出重定向到 bash 中的变量失败

我可以将退出代码 %errorlevel% 从 WSL Bash 返回到 Powershell 或命令提示符吗?

Part2 Linux Bash Shell变量和重定向

管道命令输出到 tee 但也保存命令的退出代码 [重复]