หลังจากลองใช้วิธีแก้ปัญหาส่วนใหญ่ที่นี่สิ่งที่ง่ายที่สุดที่ฉันพบคือชัดเจนโดยใช้ไฟล์ชั่วคราว ฉันไม่แน่ใจว่าคุณต้องการทำอะไรกับเอาต์พุตหลายบรรทัด แต่คุณสามารถจัดการกับมันทีละบรรทัดโดยใช้การอ่าน เกี่ยวกับสิ่งเดียวที่คุณทำไม่ได้จริงๆคือติดมันทั้งหมดไว้ในตัวแปรเดียวกัน แต่สำหรับจุดประสงค์ในทางปฏิบัติส่วนใหญ่วิธีนี้ง่ายต่อการจัดการ
./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 ของคุณได้อย่างง่ายดายในขณะที่ลูปดังนั้นให้สคริปต์ที่จะรันหนึ่งบรรทัดล้าง stdin และออก อย่างที่ฉันคิดว่าจะทำอย่างงั้นเหรอ? ฉันเพิ่งเห็นมันเมื่อเร็ว ๆ นี้ตัวอย่างโค้ดอื่น ๆ ที่นี่: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
อีกที! เวลานี้ด้วย filehandle อื่น (stdin, stdout, stderr เท่ากับ 0-2 ดังนั้นเราสามารถใช้ & 3 หรือสูงกว่าในการทุบตี)
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 เหมือนกับชื่อไฟล์จริง อาจไม่จำเป็นต้องอธิบายที่นี่ แต่มีคนบ่นในความคิดเห็น