bash coproc и остатки вывода coproc

Мне нужно прочитать некоторые данные конфигурации в переменные окружения в сценарии bash.

"Очевидный" (но неверный) шаблон таков:

egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...

Это не удается, потому что read выполняется во вложенной оболочке и поэтому не может установить переменные в вызывающей оболочке. Поэтому в качестве альтернативы я придумал следующее

coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...

которое работает отлично.

Чтобы проверить, что произойдет, если сопроцесс вернет более одной строки, я попробовал следующее:

coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...

где config-file.cfg содержит три строки.

$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3

Я ожидал, что будет обработана первая строка файла, а затем появится сообщение об ошибке типа "разорванная труба". Хотя обработал первую строку, сообщения об ошибке не было, и никакой coprocess не был запущен.

Тогда я попробовал сделать следующее в скрипте:

$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?

Запуск:

$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0

Куда делись оставшиеся две строки? Я ожидал, что либо "сломанная труба", либо wait зависнет, так как нечем было читать оставшиеся строки, но, как вы можете видеть, код возврата был нулевым.

10
задан Jim Garrison 4 October 2011 в 17:48
поделиться