Utilizzando la sostituzione del processo di bash, voglio eseguire contemporaneamente due diversi comandi su un file. In questo esempio non è necessario, ma immagina che "cat/usr/share/dict/words" sia un'operazione molto costosa come la decompressione di un file da 50 gb.Risultati errati con sostituzione e coda di processo bash?
cat /usr/share/dict/words | tee >(head -1 > h.txt) >(tail -1 > t.txt) > /dev/null
Dopo questo comando mi aspetterei h.txt per contenere la prima linea delle parole file "A", e t.txt per contenere l'ultima riga del file "Zyzzogeton".
Tuttavia, ciò che effettivamente accade è che h.txt contiene "A" ma t.txt contiene "argillaceo" che è circa il 5% nel file.
Perché succede? Sembra che il processo "coda" stia terminando presto o che i flussi si confondano.
esecuzione di un altro comando simile come questo si comporta come previsto:
cat /usr/share/dict/words | tee >(grep ^a > a.txt) >(grep ^z > z.txt) > /dev/null
Dopo questo comando mi aspetto a.txt per contenere tutte le parole che iniziano con "a", mentre z.txt contiene tutti le parole che iniziano con "z", che è esattamente quello che è successo.
Quindi, perché non funziona con "coda" e con quali altri comandi non funzionerà?
Penso che questo è legato alla http://stackoverflow.com/questions/4489139/bash-process-replacement-and-syncing che suggerisce che i processi con nella sostituzione escono non appena termina il comando esterno, ma sinceramente non sono in grado di dimostrare che è il problema corrente con qualsiasi comando I Ho provato fino ad ora –