我在我的脚本中shell了一个在控制台上打印消息的函数。它可以从任何其他函数调用。
function print_message
{
echo "message content"
}
问题是,在shell中,echo
或printf
等函数通常在标准输出上打印数据,将其消息重定向到调用函数,而不是返回值。
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吗?
答案 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);
...
}
注意,您提供的函数的返回值现在将是函数的名称。