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

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

【问题讨论】:

    标签: linux bash unix exit-code


    【解决方案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)中提到的那样做,有什么办法吗?
    • 你可以通过重定向到两个不同的临时文件来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-07-05
    • 2018-08-16
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多