Мне нужно прочитать некоторые данные конфигурации в переменные окружения в сценарии 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
зависнет, так как нечем было читать оставшиеся строки, но, как вы можете видеть, код возврата был нулевым.