Попробовав большинство решений здесь, я обнаружил, что проще всего было использовать временный файл. Я не уверен, что вы хотите сделать с многострочным выводом, но вы можете справиться с ним построчно, используя read. Единственное, что вы не можете сделать, это просто вставить все в одну переменную, но для большинства практических целей это гораздо проще.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Быстрый взлом, чтобы заставить его выполнить запрошенное действие:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Обратите внимание, это добавляет дополнительную строку. Если вы работаете над этим, вы можете кодировать его, мне просто лень.
РЕДАКТИРОВАТЬ: Хотя этот случай работает очень хорошо, люди, читающие это, должны знать, что вы можете легко сжать свой stdin внутри цикла while, что даст вам скрипт, который будет запускать одну строку, очищать stdin и выходить. Как ssh сделает то, что я думаю? Я только недавно видел это, другие примеры кода здесь: https://unix.stackexchange.com/questions/24260/reading-lines-from-a-file-with-bash-for-vs-while
Еще раз! На этот раз с другим дескриптором файла (stdin, stdout, stderr 0-2, поэтому мы можем использовать & 3 или выше в bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
Вы также можете использовать mktemp, но это всего лишь быстрый пример кода. Использование для mktemp выглядит так:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Затем используйте $ filenamevar так же, как действительное имя файла. Возможно, здесь не нужно объяснять, но кто-то жаловался в комментариях.