Ho bisogno di leggere alcuni dati di configurazione in variabili di ambiente in uno script bash.bash coproc e uscita coproc rimanente
Il pattern "ovvio" (ma non corretto) è:
egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...
Questo fallisce perché read
viene eseguito in una subshell e quindi non può impostare le variabili nella shell chiamante. Così mi è venuta in mente come alternativa
coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
che funziona bene.
Per verificare cosa succede se il coprocesso restituisce più di una riga, ho provato questo:
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
dove config-file.cfg
contiene tre linee.
$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
Mi aspettavo questo per elaborare la prima riga del file, seguita da una sorta di messaggio di errore "tubo rotto". Mentre lo ha effettuato il processo nella prima riga, non è stato visualizzato alcun messaggio di errore e non è stata eseguita alcuna coprocess.
Così ho poi provato il seguente in uno script:
$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?
L'esecuzione:
$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0
Dove sono finiti i restanti due linee andare? Mi sarei aspettato che il "tubo rotto", o il wait
da appendere poiché non c'era nulla da leggere le righe rimanenti, ma come si può vedere il codice di ritorno era zero.
A meno che non manchi qualcosa, qualcosa come 'leggere VAR1 VAR2 VAR3 <<(egrep" modello "config-file.cfg)" sarebbe sufficiente, no? –
@ShawnChin: sta ignorando la domanda. I coproc sono ottimi motivi per cui l'OP non deve spiegare prima – sehe
Perdona la mia ignoranza. Ammetto che i coproc sono fantastici, ma il commento è stato una risposta al pensiero che i coproc potrebbero essere un overkill se si tratta semplicemente di evitare di leggere la corsa in sottotitoli e perdere i vars. Probabilmente mi sbaglio, come al solito. –