Мне нужно прочитать некоторые данные конфигурации в переменные среды в скрипте 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...
, которая отлично работает.
Чтобы проверить, что происходит, если сопроцесс возвращает более одной строки, я попробовал это:*
где config-file.cfg
содержит три строки.
$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
Я ожидал, что это обработает первую строку в файле, после чего появится какое-то сообщение об ошибке «сломанная труба».В то время как обработал первую строку, сообщения об ошибке не было и сопроцесс не был запущен.
Поэтому я попытался в скрипте следующее:
$ 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
зависнет, поскольку нечего было читать оставшиеся строки, но, как вы можете видеть, код возврата был равен нулю.