Trong một tập lệnh bash, tôi muốn nắm bắt đầu ra tiêu chuẩn của một dòng lệnh dài theo từng dòng để chúng có thể được phân tích và báo cáo trong khi lệnh ban đầu vẫn đang chạy. Đây là cách phức tạp mà tôi có thể tưởng tượng khi làm điều đó:
# 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
Tôi muốn biết nếu có một cách đơn giản hơn để làm như vậy.
CHỈNH SỬA:
Để làm rõ câu hỏi của tôi, tôi sẽ thêm điều này. Các longcommand
hiển thị dòng trạng thái của mình bằng dòng một lần mỗi giây. Tôi muốn bắt đầu ra trước khi longcommand
hoàn thành.
Bằng cách này, tôi có khả năng có thể giết chết longcommand
nếu nó không cung cấp kết quả mà tôi mong đợi.
Tôi đã thử:
longcommand |
while IFS= read -r line
do
whatever "$line"
done
Nhưng whatever
(ví dụ echo
) chỉ thực hiện sau khi longcommand
hoàn thành.