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

Raf*_*ael 3 bash

我知道您可以使用 echo 在控制台上打印信息。但我试过用整数返回,但对我来说效果不佳。

作为

function echo_test() {
    echo 1;
}

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

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}
Run Code Online (Sandbox Code Playgroud)

输出“很棒”,但是:

function return_test() {
    return 1;
}

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

    if [[ ${result} == 1 ]]; then
        echo great;
    else
        echo nope;
    fi
}
Run Code Online (Sandbox Code Playgroud)

没有工作......并输出“不”。

Cha*_*ffy 6

您将两个不同的东西混为一谈:outputexit status

echo生成输出。类似的命令替换会$(...)捕获该输出,但是如果您在没有它的情况下运行命令,则该输出将进入终端。

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


要查看您的return_test函数实际执行某些操作,您可以编写:

return_test() {
    return 1;
}

return_test; echo "Exit status is $?"
Run Code Online (Sandbox Code Playgroud)

另请注意,可以同时执行以下两种操作:

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

myfunc_out=$(myfunc); myfunc_rc=$?
echo "myfunc_out is: $myfunc_out"
echo "myfunc_rc is: $myfunc_rc"
Run Code Online (Sandbox Code Playgroud)

...发出:

return_test() {
    return 1;
}

return_test; echo "Exit status is $?"
Run Code Online (Sandbox Code Playgroud)

一种有用的习惯用法是将赋值放在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
Run Code Online (Sandbox Code Playgroud)

...在这种情况下,它会返回:

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

myfunc_out=$(myfunc); myfunc_rc=$?
echo "myfunc_out is: $myfunc_out"
echo "myfunc_rc is: $myfunc_rc"
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您可能会注意到,当上面的代码捕获 时$?,它会尽可能接近捕获退出状态的命令,即使这意味着打破围绕垂直空白的正常约定。这是有意的,以减少在$?设置点和使用点之间无意中修改添加日志记录或其他代码更改的可能性。