Как напечатать сообщения журнала в функции ksh, из которой я хочу прочитать? - PullRequest
0 голосов
/ 30 августа 2018

Скажите, у меня есть функция:

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"

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Другая возможность - использовать именованный канал (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

Если бы у вас было много вызовов функций, вы могли бы создать / уничтожить канал только один раз.

0 голосов
/ 01 сентября 2018

Вы можете написать другие сообщения журнала в 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}"

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