Я дослідив майже всі наявні подібні питання , безрезультатно.
Докладно опишу проблему:
Я запускаю кілька без нагляду сценаріїв, і вони можуть створювати стандартні вихідні та стандартні рядки помилок, я хочу захопити їх у їх точному порядку, як показано емулятором терміналу, а потім додати до них префікси типу "STDERR:" та "STDOUT:".
Я намагався використовувати труби і навіть підхід на основі еполі на них, безрезультатно. Я думаю, що рішення в піктограмі, хоча я не майстер у цьому. Я також зазирнув у вихідний код VTE Gnome , але це було не дуже продуктивно.
В ідеалі я б застосував Go замість Bash для цього, але цього не зміг. Схоже, труби автоматично забороняють підтримувати правильний порядок ліній через буферизацію.
Хтось зміг зробити щось подібне? Або просто неможливо? Я думаю, що якщо емулятор терміналу може це зробити, то це не так - можливо, створивши невелику програму C, що обробляє PTY (и) інакше?
В ідеалі я б використовував асинхронний ввід, щоб прочитати ці 2 потоки (STDOUT і STDERR), а потім повторно роздрукувати їх друге мої потреби, але порядок введення є вирішальним!
ПРИМІТКА. Я знаю, що посилюється, але це не працює для мене зі сценаріями Bash і не може бути легко відредагований, щоб додати префікс (оскільки він в основному обшиває багато системних дзвінків).
Оновлення: додано нижче двох груп
(до другої випадкової затримки можна додати у зразок сценарію, який я надав для підтвердження послідовного результату)
Оновлення: рішення цього питання також вирішило б це інше питання , як зазначав @Gilles. Однак я прийшов до висновку, що не можна робити те, про що тут і там просять. При використанні 2>&1
обох потоків правильно об'єднуються на рівні pty / pipe, але для використання потоків окремо і в правильному порядку дійсно слід використовувати підхід ступінчастого виклику, який викликає підключення syscall, і його можна розглядати як брудне в багатьох відношеннях.
Я буду радий оновити це питання, якщо хтось може спростувати вищезазначене.