bash中的echo和return之间有什么区别?

时间:2018-08-08 20:43:49

标签: bash

我了解您可以使用echo在控制台上打印信息。 但是我尝试将return与整数一起使用,但对我来说效果不佳。

截至

function echo_test() {
    echo 1;
}

function output_echo() {
    local result="$(echo_test)";

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}

输出“很好”,但是:

function return_test() {
    return 1;
}

function output_return() {
    local result="$(return_test)";

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}

不起作用...并输出“ nope”。

1 个答案:

答案 0 :(得分:3)

您要混淆两件事:输出退出状态

echo生成输出。像$(...)这样的命令替换将捕获该输出,但是如果您在没有命令的情况下运行命令,则该输出将到达终端。

return设置退出状态。这是用来确定运行if your_function; then ...时采用哪个分支或填充$?的对象。


要查看您的return_test函数实际上在做什么,您可以编写:

return_test() {
    return 1;
}

return_test; echo "Exit status is $?"

此外,请注意,两种方法都可以实现:

myfunc() {
    echo "This is output"
    return 3
}

myfunc_out=$(myfunc); myfunc_rc=$?
echo "myfunc_out is: $myfunc_out"
echo "myfunc_rc is: $myfunc_rc"

...发出:

myfunc_out is: This is output
myfunc_rc is: 3

一个有用的习惯用法是将一个赋值放在if条件内,以在捕获输出时分支到退出状态:

if myfunc_out=$(myfunc); then
  echo "myfunc succeeded (returned 0), with output: [$myfunc_out]"
else rc=$?
  echo "myfunc failed (nonzero return of $rc), with output: [$myfunc_out]"
fi

...在这种情况下,将返回:

myfunc failed (nonzero return of 3), with output: [This is output]

顺便说一句,您可能会注意到,当以上代码捕获$?时,它会尽可能接近捕获其退出状态的命令,即使这意味着违反常规约定垂直空白。这是有意的,目的是减少在设置点和使用点之间无意间修改$?的可能性,从而增加添加日志或其他代码更改的可能性。