Dopo aver provato la maggior parte delle soluzioni qui, la cosa più semplice che ho trovato è stata ovvia: usare un file temporaneo. Non sono sicuro di cosa tu voglia fare con il tuo output su più righe, ma puoi quindi gestirlo riga per riga usando read. L'unica cosa che non puoi davvero fare è attaccare facilmente tutto nella stessa variabile, ma per scopi pratici questo è molto più facile da affrontare.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Trucco rapido per farlo eseguire l'azione richiesta:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Nota che questo aggiunge una riga aggiuntiva. Se ci lavori puoi codificarlo, sono semplicemente troppo pigro.
EDIT: Mentre questo caso funziona perfettamente bene, le persone che leggono questo dovrebbero essere consapevoli che puoi facilmente schiacciare il tuo stdin all'interno del ciclo while, dandoti così uno script che eseguirà una riga, cancella lo stdin ed esce. Come ssh farà che penso? L'ho visto di recente, altri esempi di codice qui: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
Un'altra volta! Questa volta con un filehandle diverso (stdin, stdout, stderr sono 0-2, quindi possiamo usare & 3 o superiore in bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
puoi anche usare mktemp, ma questo è solo un rapido esempio di codice. L'utilizzo di mktemp è simile a:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Quindi usa $ filenamevar come faresti con il nome reale di un file. Probabilmente non ha bisogno di essere spiegato qui, ma qualcuno si è lamentato nei commenti.