W skrypcie bash chciałbym uchwycić standardowe dane wyjściowe długich linii poleceń po linii, aby można je było analizować i zgłaszać podczas działania polecenia początkowego. Oto skomplikowany sposób, w jaki mogę to sobie wyobrazić:
# 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
Chciałbym wiedzieć, czy istnieje prostszy sposób na zrobienie tego.
EDYTOWAĆ:
Aby wyjaśnić moje pytanie, dodam to. longcommand
Wyświetla jego stan linia po linii raz na sekundę. Chciałbym uchwycić wynik przed longcommand
ukończeniem.
W ten sposób mogę potencjalnie zabić, longcommand
jeśli nie przyniesie oczekiwanych rezultatów.
Próbowałem:
longcommand |
while IFS= read -r line
do
whatever "$line"
done
Ale whatever
(np. echo
) Wykonuje się dopiero po longcommand
zakończeniu.