Oricum ai rezolva acest lucru, va trebui să tamponezi ieșirea comenzii până când poți citi ultima linie, pentru a ști unde să o scrii.
Singura modalitate rațională în care mă gândesc să fac acest lucru este să folosesc un fișier temporar, apoi să-l redenumim:
tmpfile=$(mktemp)
outfile=$(comanda | tee „$tmpfile” | coada -n 1)
mv „$tmpfile” „$outfile”
Te poți schimba | la |& dacă doriți cu adevărat să capturați atât stdout, cât și stderr - dar rețineți că acest lucru Mai duce la denumirea fișierului de ieșire după un mesaj de eroare (deși probabil că există o modalitate de a evita asta folosind un descriptor inteligent de fișier fu).
Este posibil să se implementeze o soluție alternativă folosind burete comanda (din pachet moreutils), dar probabil că folosește aceeași tehnică sub capotă. De fapt, spune pagina de manual
Când este posibil, sponge creează sau actualizează fișierul de ieșire atomic prin
redenumirea unui fișier temporar în loc.
O altă opțiune ar putea fi folosirea rev pentru a inversa rândurile astfel încât să puteți citi mai întâi ultima linie și apoi rev din nou pentru a restabili ordinea de ieșire. Cu toate acestea, aceasta implică tamponarea întregii ieșiri de două ori.