Sau khi thử hầu hết các giải pháp ở đây, điều dễ dàng nhất tôi tìm thấy là điều hiển nhiên - sử dụng tệp tạm thời. Tôi không chắc chắn những gì bạn muốn làm với đầu ra nhiều dòng của bạn, nhưng sau đó bạn có thể xử lý từng dòng bằng cách đọc. Về điều duy nhất bạn thực sự không thể làm là dễ dàng gắn kết tất cả trong cùng một biến, nhưng đối với hầu hết các mục đích thực tế, đây là cách dễ dàng hơn để giải quyết.
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
Hack nhanh để thực hiện hành động được yêu cầu:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
Lưu ý điều này thêm một dòng thêm. Nếu bạn làm việc với nó, bạn có thể viết mã xung quanh nó, tôi quá lười biếng.
EDIT: Mặc dù trường hợp này hoạt động hoàn hảo, nhưng mọi người đọc điều này nên lưu ý rằng bạn có thể dễ dàng nén stdin của mình bên trong vòng lặp while, do đó cung cấp cho bạn một tập lệnh sẽ chạy một dòng, xóa stdin và thoát. Giống như ssh sẽ làm điều đó tôi nghĩ? Tôi mới thấy nó gần đây, các ví dụ mã khác ở đây: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-fter
Một lần nữa! Lần này với một filehandle khác (stdin, stdout, stderr là 0-2, vì vậy chúng ta có thể sử dụng & 3 hoặc cao hơn trong bash).
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
bạn cũng có thể sử dụng mktemp, nhưng đây chỉ là một ví dụ mã nhanh. Cách sử dụng cho mktemp trông giống như:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
Sau đó sử dụng $ filenamevar giống như tên thực của tệp. Có lẽ không cần phải giải thích ở đây nhưng ai đó phàn nàn trong các bình luận.