Sto cercando di aggiungere alcune informazioni di fronte ad ogni uscita di linea da un file, da:Proxy ordine tenuta output/error in bash
- cattura sia stdout e stderr
- anteponendo le informazioni
- output al manico originale
Ecco il mio script di test:
#!/bin/bash
#
# Test proxying stdout and stderr
#
function proxy-stdouterr() {
local name="$1"
local handle=$2
while IFS='' read -r line
do
echo -e "[ ${name}: ${line} ]" >&${handle}
done
}
# Output some messages and attempt to parse them
(
echo "1: Normal message"
echo "2: Error" >&2
echo "3: Normal message"
echo "4: Error" >&2
) 2> >(proxy-stdouterr "stderr" 2) > >(proxy-stdouterr "stdout" 1)
Questo funziona abbastanza bene, ma non conserva l'ordine nel terminale (Ubuntu 12.04).
uscite Quando non proxy:
1: Normal message
2: Error
3: Normal message
4: Error
Tuttavia quando proxy l'ordine non viene mantenuta. Peggio ancora questo non è deterministica, la maggior parte del tempo è:
[ stderr: 2: Error ]
[ stderr: 4: Error ]
[ stdout: 1: Normal message ]
[ stdout: 3: Normal message ]
Ma di tanto in tanto:
[ stderr: 2: Error ]
[ stdout: 1: Normal message ]
[ stderr: 4: Error ]
[ stdout: 3: Normal message ]
Come posso risolvere questo problema?
Grazie
Penso che questo sia un problema di sincronizzazione di base: quando i produttori scrivono a una risorsa condivisa in parallelo, non è possibile garantire l'ordine in cui tali scritture avvengono senza una qualche forma di coordinamento. – larsks
Inoltre, +1 per fornire un esempio che mostri chiaramente la domanda! – larsks
larsk è corretto. L'output viene suddiviso in due flussi di I/O separati: STDOUT e STDERR (i "produttori"), che vengono quindi "proxy", prefissati e quindi richiamati alla console. Il tempo per elaborare ogni flusso può variare, specialmente con una funzione bash come parte dello stream, quindi non c'è modo di sincronizzare il loro output (senza usare alcun tipo di segnale). – aks