Po wypróbowaniu większości rozwiązań tutaj najłatwiejszą rzeczą, jaką znalazłem, była oczywistość - użycie pliku tymczasowego. Nie jestem pewien, co chcesz zrobić z wyjściem wieloliniowym, ale możesz sobie z tym poradzić, czytając. Jedyną rzeczą, której tak naprawdę nie można zrobić, to łatwo umieścić to wszystko w tej samej zmiennej, ale dla większości praktycznych celów jest to o wiele łatwiejsze.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Szybki hack, aby wykonać żądaną akcję:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Uwaga: dodaje to dodatkową linię. Jeśli nad tym popracujesz, możesz go zakodować, jestem po prostu zbyt leniwy.
EDYCJA: Chociaż ten przypadek działa idealnie dobrze, osoby czytające to powinny mieć świadomość, że możesz łatwo zgnieść swoje standardowe wejście w pętli while, dając w ten sposób skrypt, który uruchomi jedną linię, wyczyści standardowe wejście i zakończy działanie. Jak ssh zrobi to, co myślę? Właśnie to widziałem, inne przykłady kodu tutaj: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
Jeszcze raz! Tym razem z innym uchwytem pliku (stdin, stdout, stderr to 0-2, więc możemy używać & 3 lub wyższej w bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
możesz także użyć mktemp, ale to tylko szybki przykład kodu. Użycie mktemp wygląda następująco:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Następnie użyj $ filenamevar, tak jak rzeczywista nazwa pliku. Prawdopodobnie nie trzeba tu wyjaśniać, ale ktoś narzekał w komentarzach.