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

时间:2015-07-27 15:04:51

标签: bash shell output

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

function print_message
{
    echo "message content"
}

问题是,在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.

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

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

3 个答案:

答案 0 :(得分:20)

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

如果您希望静态消息不被捕获,那么您可以使用标准错误(但不要对不是错误消息或调试消息等的事情执行此操作,请)。

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

要完全重定向到该功能的标准错误,您可以执行以下任一操作。

print_message() {
    echo "message content" >&2
}

print_message() {
    echo "message content"
} >&2

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

同时避免使用function关键字,因为它不是POSIX / spec,也不是广泛可移植的。

答案 1 :(得分:1)

您明确表示"不要直接打印输出!把它放在变量中,这样我就可以自己打印了!"。

您可以直接停止这样做,并自动打印消息:

$ cat yourscript 
#!/bin/bash

function print_message
{
    echo "message content"
}

print_message

$ ./yourscript
message content

答案 2 :(得分:-2)

在$(...)中调用print_message会重定向输出。如果您不希望重定向输出,则调用不带$(...)的命令。 E.g。

@Override
protected void onResume() {
    super.onResume();
    setUpMapIfNeeded();
    mMap.clear();
    mClusterManager = new ClusterManager<ItemMarker>(this, mMap);
    ...
}

注意,您提供的函数的返回值现在将是函数的名称。