Как использовать строку китайских иероглифов в качестве ввода для другой команды в bash?

Если я правильно понимаю, вы хотите записать выходные данные COMMAND1 с маркером, указывающим, что они исходят от COMMAND1. Вот как это сделать:

COMMAND1 | tee >(sed 's/^/command1: /' >>out.log) | COMMAND2

Обратите внимание, что:

  • Это ставит маркер command1:в начале каждой строки, а не только в начале первой строки, что я считаю желательным, но это не то, что вы пытались сделать.
  • command1не должен содержать никаких специальных символов sed (, иначе они должны быть защищены обратной косой чертой ).
  • Поскольку out.logоткрывается для добавления, нет риска перекрытия вывода, даже если несколько команд выводят данные в один и тот же файл журнала параллельно.
  • Так как out.logоткрывается в этом фрагменте только один раз, все строки будут по порядку.
  • Теперь о плохих новостях. :Если вы несколько раз заходите в один и тот же файл параллельно, нет никакой гарантии, что строки появятся в желаемом порядке. Например,

    echo hello | tee >(sed 's/^/command1: /' >>out.log) | tr a-z A-Z | tee >(sed 's/^/command2: /' >>out.log)
    

    может регистрировать command2: HELLOдо command1: HELLO.

  • Если вы выполняете вход в один и тот же файл несколько раз параллельно, а содержимое строки слишком длинное, строки из разных экземпляров могут перемежаться. Я думаю, что обычные реализации sed будут проходить через строки длиной менееPIPE_BUFбайт, но я не уверен.

Учитывая ограничения порядка и атомарности, я рекомендую вести журнал в отдельные файлы, и в этом случае вам не нужны префиксы.

2
18.10.2019, 20:16
0 ответов

Теги

Похожие вопросы