Nachdem ich die meisten Lösungen hier ausprobiert hatte, war das Einfachste, was ich fand, das Offensichtliche - die Verwendung einer temporären Datei. Ich bin mir nicht sicher, was Sie mit Ihrer mehrzeiligen Ausgabe machen möchten, aber Sie können dann zeilenweise mit read damit umgehen. Das Einzige, was Sie nicht wirklich tun können, ist, alles einfach in dieselbe Variable zu stecken, aber für die meisten praktischen Zwecke ist dies viel einfacher zu handhaben.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Schneller Hack, damit es die angeforderte Aktion ausführt:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Beachten Sie, dass dies eine zusätzliche Zeile hinzufügt. Wenn du daran arbeitest, kannst du es umschreiben, ich bin einfach zu faul.
BEARBEITEN: Während dieser Fall perfekt funktioniert, sollten sich die Leser bewusst sein, dass Sie Ihr stdin leicht in der while-Schleife quetschen können, wodurch Sie ein Skript erhalten, das eine Zeile ausführt, stdin löscht und beendet. Wie wird ssh das tun, denke ich? Ich habe es erst kürzlich gesehen, andere Codebeispiele hier: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
Ein Mal noch! Diesmal mit einem anderen Dateihandle (stdin, stdout, stderr sind 0-2, also können wir & 3 oder höher in bash verwenden).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
Sie können auch mktemp verwenden, dies ist jedoch nur ein kurzes Codebeispiel. Die Verwendung für mktemp sieht folgendermaßen aus:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Verwenden Sie dann $ filenamevar wie den tatsächlichen Namen einer Datei. Wahrscheinlich muss hier nicht erklärt werden, aber jemand hat sich in den Kommentaren beschwert.