構成データを 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...
whereconfig-file.cfg
には 3 行が含まれます。
$ 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
残りの 2 行はどこに行ったのでしょうか。「壊れたパイプ」かwait
、残りの行を読み取るものが何もないためにハングすることを期待していましたが、ご覧のとおり、リターン コードはゼロでした。