Dopo provando la maggior parte delle soluzioni qui, la cosa più semplice che ho trovato è stata l'ovvia: usare un file temporaneo. Non sono sicuro di cosa vuoi fare con il tuo output su più righe, ma puoi gestirlo riga per riga usando read.L'unica cosa che non si può veramente fare è attaccare tutto nella stessa variabile, ma per molti scopi pratici è molto più facile da gestire.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
mod rapido per fargli fare l'azione richiesta:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Nota questo aggiunge una linea supplementare. Se ci lavori sopra, puoi codificarci intorno, sono solo troppo pigro.
EDIT: Anche se questo caso funziona perfettamente, persone che leggono questo devono essere consapevoli che si può facilmente schiacciare il tuo stdin all'interno del ciclo while, dando così uno script che verrà eseguito una sola riga, stdin chiara, e l'uscita . Come ssh farò quello che penso? L'ho appena visto di recente, altri esempi di codice qui: https://unix.stackexchange.com/questions/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 più in bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
è possibile utilizzare anche mktemp, ma questo è solo un esempio di codice rapido. Uso per mktemp assomiglia:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Quindi utilizzare $ filenamevar come si farebbe il nome effettivo di un file. Probabilmente non ha bisogno di essere spiegato qui ma qualcuno si è lamentato nei commenti.
mi sorprende. non hai $ (cat ./myscipt)? altrimenti mi sarei aspettato che provasse ad eseguire i comandi abc, def e ghi –
@litb: sì, suppongo di sì; puoi anche usare $ (<./ myscript) per evitare di eseguire un comando. –
(NB: i due commenti sopra si riferiscono a una revisione della domanda che è iniziata _Ho trovato uno script 'myscript' che contiene il seguente_, che ha portato alle domande.La revisione corrente della domanda (_Ho avuto uno script 'myscript' che emette il seguente_) rende i commenti superflui.Tuttavia, la revisione è del 2011-11-11, molto tempo dopo che sono stati fatti i due commenti –