如何在我想要读取的 ksh 函数中打印日志消息?

How to print log messages in a ksh function that I want to read from?

假设我有一个函数:

function doSomeWork
{
    #work, work, work
    echo "$result1 $result2"
}

现在我正在使用 read 读取该函数的结果:

doSomeWork | read r1 r2
echo "result1: r1, result2: r2"

效果很好,但现在我无法使用 echo 输出任何其他日志消息,因为它会破坏结果的读取。

如何在不干扰读取的情况下在 doSomeWork 中写入日志消息?


编辑:这里是该方法的演示

#!/bin/ksh
echo "7 54" | read T1 T2
echo "T1 $T1 T2 $T2"

您可以将其他日志消息写入标准错误。 另一个解决方案是确保可以过滤输出:

使用尾巴

function doSomeWork
{
    echo "work, work, work"
    result1=1
    result2=2
    echo "More work"
    echo "$result1 $result2"
}

doSomeWork | tail -1 | read r1 r2
echo "result1: ${r1}, result2: ${r2}"

用 grep

function doSomeWork
{
    echo "work, work, work"
    result1=1
    result2=2
    echo "More work"
    echo "Result $result1 $result2"
}

doSomeWork | grep Result | read dummy r1 r2
echo "result1: ${r1}, result2: ${r2}"

另一种可能性是使用 命名管道 (FIFO) 而不是匿名管道。并不总是正确的解决方案,但也许它会给你一些想法:

pipe_name=/tmp/mypipe$$
mkfifo "$pipe_name"

function doSomeWork
{

    result1='result1'
    result2='result2'
    echo "work, work, work"
    echo "$result1 $result2" > "$pipe_name"
}

doSomeWork &             # running in background, otherwise it would block
read r1 r2 < "$pipe_name"
echo "result1: r1, result2: r2"

rm "$pipe_name"

给出:

work, work, work
result1: r1, result2: r2

如果你有很多函数调用,那么你只会 create/destroy 管道一次。