如何在shell函数内直接回显标准输出?

Ara*_*hor 19 bash shell output

我,在我的脚本中,shell一个在控制台上打印消息的函数.它可以从任何其他函数调用.

function print_message
{
    echo "message content"
}
Run Code Online (Sandbox Code Playgroud)

问题是,在shell中,函数echoprintf通常在标准输出上打印数据的函数将其消息重定向到调用函数而不是返回值.

return_value=$(print_message) # this line print nothing.
echo $return_value # This line print the message. I don't want to have to do it.
Run Code Online (Sandbox Code Playgroud)

我想避免这种行为,并将其直接打印在标准 - 或错误 - 输出上.有办法吗?

或者我想在shell中使用函数我错了,我应该使用一个巨大的脚本来处理任何comportment吗?

Eta*_*ner 26

$(...)调用语法捕获标准输出.这是它的工作.这就是它的作用.

如果你想要那些没有被它捕获的静态消息,那么你可以使用标准错误(虽然不要对非错误消息或调试消息等事情这样做).

您不能拥有一个输出到标准输出的功能,但它不会$(...)被运行的上下文捕获,因为只有一个标准输出流.您可以做的最好的事情就是检测何时有控制终端/等.而是直接写入(但我建议大多数时间都不要这样做).

要完全重定向到函数的标准错误,您可以执行以下任一操作.

print_message() {
    echo "message content" >&2
}
Run Code Online (Sandbox Code Playgroud)

要么

print_message() {
    echo "message content"
} >&2
Run Code Online (Sandbox Code Playgroud)

当只有一行输出但是如果有多行输出时,差异是无关紧要的,那么后者可能稍微更优化(特别是当输出流恰好是文件时).

还要避免使用function关键字,因为它不是POSIX/spec,也不是广泛的可移植性.