【问题标题】:How to print log messages in a ksh function that I want to read from?如何在我想要读取的 ksh 函数中打印日志消息?
【发布时间】:2018-09-01 18:16:03
【问题描述】:

假设我有一个函数:

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"

【问题讨论】:

  • 使用ksh 特定的print 命令代替echoman print 并搜索file descriptor。我现在没有时间研究,这可能还需要使用exec 进行设置步骤。在此处查看[ksh] exec 的答案。 stackoverflow.com/questions/21753477/… 看起来会有所帮助。祝你好运。

标签: ksh


【解决方案1】:

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

如果你有很多函数调用,那么你只会创建/销毁管道一次。

【讨论】:

  • 像魅力一样工作!谢谢!
  • 你的 fifo 给了我一个好主意,所以我给你一个赞成票:命名管道也可以给出中间结果。将函数doSomeWork()改成...; echo "$result1" &gt; "$pipe_name"; sleep 2; echo work; sleep 2; echo "$result2" &gt; "$pipe_name"; },将主代码改成read r1 &lt; "$pipe_name"; echo "r1=$r1"; read r2 &lt; "$pipe_name"; echo "r2: $r2"。当函数仍在工作时,第一个结果已经返回!
  • 太棒了!命名管道作为一种灵活的进程间通信机制也经常被忽视。
【解决方案2】:

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

使用尾巴

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多