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

如何在ksh函数中打印我要读取的日志消息?,ksh,Ksh,假设我有一个函数: function doSomeWork { #work, work, work echo "$result1 $result2" } 现在,我使用如下方式读取该函数的结果: doSomeWork | read r1 r2 echo "result1: r1, result2: r2" 它工作得很好,但是现在我不能使用echo输出任何其他日志消息,因为它会影响结果的读取 如何在doSomeWork中写入日志消息而不干扰读取 编辑:这里是该方法的演示 #!/

假设我有一个函数:

function doSomeWork
{
    #work, work, work
    echo "$result1 $result2"
}
现在,我使用如下方式读取该函数的结果:

doSomeWork | read r1 r2
echo "result1: r1, result2: r2"
它工作得很好,但是现在我不能使用echo输出任何其他日志消息,因为它会影响结果的读取

如何在doSomeWork中写入日志消息而不干扰读取


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

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

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

用尾巴

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}"
和格雷普

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}"

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

用尾巴

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}"
和格雷普

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"

如果有多个函数调用,则只创建/销毁一次管道

另一种可能性是使用命名管道(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"

如果有多个函数调用,则只创建/销毁一次管道

使用
ksh
specific
print
命令代替
echo
manprint
并搜索
文件描述符。我现在没有时间研究,这可能还需要使用
exec
执行设置步骤。请看这里的
[ksh]exec
答案。看来会有帮助的。祝你好运。使用
ksh
specific
print
命令代替
echo
manprint
并搜索
文件描述符。我现在没有时间研究,这可能还需要使用
exec
执行设置步骤。请看这里的
[ksh]exec
答案。看来会有帮助的。祝你好运。工作很有魅力!谢谢你的fifo给了我一个好主意,所以我给你一个向上投票:命名的管道也可以给出中间结果。将函数
doSomeWork()
更改为
。。。;回显“$result1”>“$pipe\u name”;睡眠2;回声工作;睡眠2;回显“$result2”>“$pipe\u name”;}和主代码进入
读取r1<“$pipe\u name”;回音“r1=$r1”;阅读r2<“$pipe_name”;回显“r2:$r2”
。当函数仍在工作时,已返回第一个结果!伟大的命名管道作为进程间通信的一种灵活机制也常常被忽视。它的工作方式很有魅力!谢谢你的fifo给了我一个好主意,所以我给你一个向上投票:命名的管道也可以给出中间结果。将函数
doSomeWork()
更改为
。。。;回显“$result1”>“$pipe\u name”;睡眠2;回声工作;睡眠2;回显“$result2”>“$pipe\u name”;}和主代码进入
读取r1<“$pipe\u name”;回音“r1=$r1”;阅读r2<“$pipe_name”;回显“r2:$r2”
。当函数仍在工作时,已返回第一个结果!伟大的命名管道作为一种灵活的进程间通信机制也常常被忽视。