У меня есть цикл for, который я передаю через ssh на сервер, отформатированный так, чтобы он выглядел примерно так ...
i=0
for cmd in cmd_list;
do ${cmd} | sed "s/^/OUTPUT_${i}_: /" &
(( i++ ));
done;
wait
Идея состоит в том, что цикл for будет выполнять список командчто я даю это и направляю каждый к sed, где sed добавляет каждую строку вывода с номером команды (0, 1, 2, 3 и т. д.).Затем это фоны, чтобы позволить параллельное выполнение.Это позволяет мне отслеживать, с какой командой был связан вывод, поскольку данные могли возвращаться одновременно и все смешиваться.Это работает очень хорошо.В зависимости от времени, когда команды выводят информацию, и когда они завершены, вывод может выглядеть примерно так ...
OUTPUT_0_: some_data_string_from_a_command
OUTPUT_2_: some_data_string_from_a_command
OUTPUT_0_: some_data_string_from_a_command
OUTPUT_3_: some_data_string_from_a_command
OUTPUT_1_: some_data_string_from_a_command
OUTPUT_1_: some_data_string_from_a_command
Однако, что я действительно хочу сделать, это ...
do ${cmd} 2>&1 | sed "s/^/OUTPUT_${i}_${PIPESTATUS[0]}: /" &
Так что я могу вернуть это ...
OUTPUT_0_0: some_data_string_from_a_command
OUTPUT_2_1: some_error_message_from_a_command
OUTPUT_0_0: some_data_string_from_a_command
OUTPUT_3_1: some_error_message_from_a_command
OUTPUT_1_0: some_data_string_from_a_command
OUTPUT_1_0: some_data_string_from_a_command
Это прекрасно работает с первой командой, если она выходит из строя.Обычно я получаю ненулевой код выхода из $ {PIPESTATUS [0]}.Однако, когда я намеренно разместил команды в списке, который, как я знаю, потерпит неудачу (например, cat / tmp / some_non_existent_file), PIPESTATUS не даст мне правильный код завершения команды в цепочке каналов.Иногда я получаю 0 вместо реального кода выхода.
Есть идеи, почему это так?