ในสคริปต์ทุบตีฉันต้องการจับเอาท์พุทมาตรฐานของบรรทัดคำสั่งแบบยาวต่อบรรทัดเพื่อให้สามารถวิเคราะห์และรายงานได้ในขณะที่คำสั่งเริ่มต้นยังคงทำงานอยู่ นี่เป็นวิธีที่ซับซ้อนที่ฉันสามารถจินตนาการได้:
# Start long command in a separated process and redirect stdout to temp file
longcommand > /tmp/tmp$$.out &
#loop until process completes
ps cax | grep longcommand > /dev/null
while [ $? -eq 0 ]
do
    #capture the last lines in temp file and determine if there is new content to analyse
    tail /tmp/tmp$$.out
    # ...
    sleep 1 s  # sleep in order not to clog cpu
    ps cax | grep longcommand > /dev/null
done
ฉันต้องการทราบว่ามีวิธีที่ง่ายกว่าในการทำเช่นนั้น
แก้ไข:
เพื่อชี้แจงคำถามของฉันฉันจะเพิ่มนี้ longcommandแสดงบรรทัดสถานะของตนโดยสายหนึ่งครั้งต่อวินาที ฉันต้องการที่จะจับเอาท์พุทก่อนที่จะlongcommandเสร็จสมบูรณ์
ด้วยวิธีนี้ฉันสามารถฆ่าlongcommandถ้ามันไม่ได้ให้ผลลัพธ์ที่ฉันคาดหวัง
ฉันเหนื่อย:
longcommand |
  while IFS= read -r line
  do
    whatever "$line"
  done
แต่whatever(เช่นecho) จะดำเนินการหลังจากlongcommandเสร็จสิ้นเท่านั้น