Depois de tentar a maioria das soluções aqui, a coisa mais fácil que encontrei foi o óbvio - usando um arquivo temporário. Não sei ao certo o que você deseja fazer com sua saída de várias linhas, mas você pode lidar com isso linha por linha usando a leitura. A única coisa que você realmente não pode fazer é colocá-lo facilmente na mesma variável, mas para os propósitos mais práticos, é muito mais fácil lidar com isso.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Corte rápido para fazer a ação solicitada:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Observe que isso adiciona uma linha extra. Se você trabalha com isso, pode codificar, sou muito preguiçoso.
EDIT: Embora este caso funcione perfeitamente bem, as pessoas que estiverem lendo isso devem estar cientes de que você pode compactar facilmente seu stdin dentro do loop while, fornecendo um script que executará uma linha, limpará stdin e sairá. Como ssh vai fazer o que eu acho? Eu vi recentemente, outros exemplos de código aqui: /unix/24260/reading-lines-from-a-file-with-bash-for-vs- while
Mais uma vez! Desta vez, com um manipulador de arquivo diferente (stdin, stdout, stderr são 0-2, para que possamos usar & 3 ou superior no bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
você também pode usar o mktemp, mas este é apenas um exemplo de código rápido. O uso do mktemp se parece com:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Em seguida, use $ filenamevar como se fosse o nome real de um arquivo. Provavelmente não precisa ser explicado aqui, mas alguém se queixou nos comentários.