Как атомарно печатать строки из нескольких фоновых процессов в сценарии bash?

В написанной мной функции bash я запускаю несколько удаленных команд через ssh и запускаю их в отдельных фоновых процессах. Каждый из этих процессов создает множество строк текста, которые объединяются и затем сортируются. Моя проблема в том, что иногда эти строки смешиваются. То есть одна строка начинает печать, и до того, как эта строка завершает печать, другая строка начинает печать на той же строке.

Мой вопрос заключается в том, как проще всего сделать этот вывод на печать атомарным, чтобы отдельные строки не смешивались друг с другом (можно перемежать целые строки - я просто хочу, чтобы столбцы выстроились в линию)? Одна из моих идей заключалась в том, чтобы сохранить вывод для каждого параллельного фонового процесса, а затем объединить их последовательно, но мне не удалось заставить это работать (этот метод должен работать для меня, если я знал, как это правильно делать). Для справки, вот схема типа скрипта, который я пытаюсь написать:

foo() {
    (
        pids=()
        for x in "$@"
        do
            (
                ssh $x 'some-high-latency-command-with-200-lines-of-data-output'
            ) &
            pids+=( $! )
        done
        for x in "${pids[@]}"
        do
            wait $x
        done
    ) 2> /dev/null
}
5
задан jonderry 6 July 2011 в 00:42
поделиться