Zbadałem prawie wszystkie dostępne podobne pytania , ale bezskutecznie.
Pozwól mi szczegółowo opisać problem:
Uruchamiam niektóre skrypty nienadzorowane, które mogą generować standardowe dane wyjściowe i standardowe linie błędów, chcę uchwycić je w dokładnej kolejności wyświetlanej przez emulator terminala, a następnie dodać do nich przedrostek „STDERR:” i „STDOUT:”.
Próbowałem na nich używać rur, a nawet podejścia opartego na epollach, ale bezskutecznie. Myślę, że rozwiązanie jest w użyciu, choć nie jestem w tym mistrzem. Zajrzałem również do kodu źródłowego VTE Gnome , ale nie było to zbyt produktywne.
Idealnie byłoby użyć Go zamiast Bash, aby to osiągnąć, ale nie byłem w stanie. Wydaje się, że rury automatycznie zabraniają utrzymywania prawidłowej kolejności linii z powodu buforowania.
Czy ktoś był w stanie zrobić coś podobnego? Czy to po prostu niemożliwe? Myślę, że jeśli emulator terminala może to zrobić, to nie jest - może przez utworzenie małego programu C obsługującego PTY (y) inaczej?
Idealnie byłoby użyć danych asynchronicznych, aby odczytać te 2 strumienie (STDOUT i STDERR), a następnie wydrukować je na nowo według moich potrzeb, ale kolejność wprowadzania jest kluczowa!
UWAGA: Zdaję sobie sprawę ze stopniowania, ale nie działa to dla mnie ze skryptami Bash i nie można go łatwo edytować w celu dodania prefiksu (ponieważ w zasadzie pakuje wiele wywołań systemowych).
Aktualizacja: dodano poniżej dwóch znaczników
(losowe opóźnienia poniżej drugiej sekundy można dodać w przykładowym skrypcie, który podałem, aby uzyskać spójny wynik)
Aktualizacja: rozwiązanie tego pytania rozwiązałoby również inne pytanie , jak wskazał @Gilles. Doszedłem jednak do wniosku, że nie jest możliwe zrobienie tego, o co prosi się tu i tam. Podczas korzystania z 2>&1
obu strumieni są one poprawnie łączone na poziomie pty / pipe, ale aby używać strumieni oddzielnie i we właściwej kolejności, należy rzeczywiście zastosować podejście stopniowane, które ingeruje w zaczepianie systemu i może być postrzegane jako brudne na wiele sposobów.
Będę chętny zaktualizować to pytanie, jeśli ktoś będzie w stanie podważyć powyższe.