10

構成データを 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、残りの行を読み取るものが何もないためにハングすることを期待していましたが、ご覧のとおり、リターン コードはゼロでした。

4

3 に答える 3

6

上記のコメントに従って、プロセス置換を使用してそれを実現できます。この方法でreadは、サブシェルで実行されず、キャプチャされた変数が現在のシェル内で使用可能になります。

read VAR1 VAR2 VAR3 < <(egrep "pattern" config-file.cfg)

「<(list) 形式が使用されている場合、引数として渡されたファイルを読み取って、リストの出力を取得する必要があります」-「引数として渡されたファイル」とは何ですか?

それは私にとっても不可解です。Advanced Bash-scripting Guide のプロセス置換に関する章には、より包括的な説明があります。

私の見方では、<(cmd)構文が使用されるとcmd、名前付きパイプ(または一時ファイル)を介して出力が利用可能になり、構文はパイプ/ファイルのファイル名に置き換えられます。したがって、上記の例の場合、最終的には次のようになります。

read VAR1 VAR2 VAR3 < /dev/fd/63

の stdout に接続されて/dev/fd/63いる名前付きパイプですcmd

于 2011-10-04T20:20:57.050 に答える
2

私があなたの質問を正しく理解している場合(そして私が明白なことを述べていないことを願っています)、 readは次のように一度に1行ずつ読みます:

$ read a b c < config-file.cfg && echo $?
0

また:

$ printf '%s\n%s\n' one two | { read; echo "$REPLY";}
one

$ echo ${PIPESTATUS[@]}
0 0

すべての入力を読み取るには、ループが必要です。

$ coproc cat config-file.cfg
[1] 3460

$ while read -u ${COPROC[0]} VAR1 VAR2 VAR3; do echo $VAR1 $VAR2 $VAR3; done
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
[1]+  Done                    coproc COPROC cat config-file.cfg

これがFAQで説明されていることを付け加えるだけです。

于 2011-10-04T18:41:21.187 に答える