2013-09-10 8 views
6

Хорошо, я не являюсь баху-гуру и нуждаюсь в одном!Как использовать «coproc» для взаимодействия с другой управляемой командой программой

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

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

Вот один из самых простых очертаний, что я пытаюсь сделать: EDITED С ЛУЧШИМ ПОДРОБНОЕ

#! /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 

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

ответ

5
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]}" 
+0

Хорошо, но у меня не было этого пробела в фактическом коде, который я пробовал. Отредактировал сообщение и очистил его. – JoeG

+0

@JoeG вот почему вы должны показать нам реальный код ... –

+0

@JoeG Пожалуйста, посмотрите мои примеры. Я сделал обновления. – konsolebox