Как использовать "coproc" для взаимодействия с другой программой, управляемой командой

Хорошо, очевидно, я не гуру Баш и мне нужен один!

Я никогда раньше не использовал "coproc", но, похоже, это именно то, что мне нужно. Но я должен признать, что я не могу экстраполировать различные примеры ping! [Я пытался пару часов...]

Все, что я хочу сделать, - это запустить сценарий оболочки "coproc", который может принимать входные данные из стандартного входа и записывать его результаты в стандартный вывод. Я хочу, чтобы основной скрипт выполнял отправку и обработку этих команд и результатов соответственно.

Вот один из простейших набросков того, что я пытаюсь сделать:отредактировано с лучшей информацией

#! /bin/bash

coproc bkgndProc {
    /some/path/to/usefulScript.sh  maybeSomeArgsHere
}

// send command #1 to bkgndProc here
result=$(echo 'command' <&${bkgndProc[0]})    ### Doesn't work for me
echo "Did it work? $result"   ### this just prints back the 'command' I used

// here execute conditional logic based on result:
// if result1; then
//     send command #2 here, getting results
// else
//     send command #3 here, again getting results
// fi

Извините за использование приведенного выше псевдокода, но я не уверен, какими должны быть эти команды отправки! Если бы кто-нибудь мог предоставить детали, которые были бы очень благодарны!

1 ответ

Решение
result = $(echo 'command' <&${bkgndProc[0]})    ### Doesn't work for me

не будет работать по крайней мере в основном, так как у вас есть места на нем

result=$(echo 'command' <&${bkgndProc[0]})

---- Обновить ----

Простая концепция может быть показана в сценарии, как это:

#!/bin/bash

# create the co-process
coproc myproc {
    bash
}

# send a command to it (echo a)
echo 'echo a' >&"${myproc[1]}"

# read a line from its output
read line <&"${myproc[0]}"

# show the line
echo "$line"

Выходы:

a

Другой, который читает несколько строк, используя тайм-аут:

#!/bin/bash

coproc myproc {
    bash
}

# send a command to message 4 random numbers in 4 lines
echo 'echo "$RANDOM"; echo "$RANDOM"; echo "$RANDOM"; echo "$RANDOM"' >&"${myproc[1]}"

# keep reading the line until it times out
while read -t 1 -u "${myproc[0]}" line; do
    echo "$line"
done

Выход:

17393
1423
8368
1782

Если мы используем cat, он больше не будет выходить, так как другой конец все еще жив и подключен, а EOF еще не достигнут. Это причина, почему мы использовали тайм-ауты.

cat <&"${myproc[0]}"
Другие вопросы по тегам