Как перенаправить вывод нескольких команд в один файл

У меня есть bash script, который имеет следующие две команды:

ssh host tail -f /some/file | awk ..... > /some/file &

ssh host tail -f /some/file | grep .... > /some/file &

Как я могу сделать вывод обеих команд в один и тот же файл.

Ответ 1

Заметьте, что вы можете уменьшить количество вызовов ssh:

{  ssh host tail -f /some/file | 
     tee >(awk ...) >(grep ...) >/dev/null
} > /some/file &

Пример:

{ echo foobar | tee >(sed 's/foo/FOO/') >(sed 's/bar/BAR/') > /dev/null; } > outputfile
cat outputfile 
fooBAR
FOObar

Ответ 2

Используйте "append" с помощью >> или используйте фигурные скобки для включения перенаправления ввода-вывода или (иногда) используйте exec:

ssh host tail -f /some/file | awk ..... >  /some/file &
ssh host tail -f /some/file | grep .... >> /some/file &

или

{
ssh host tail -f /some/file | awk ..... &
ssh host tail -f /some/file | grep .... &
} > /some/file

или

exec > /some/file
ssh host tail -f /some/file | awk ..... &
ssh host tail -f /some/file | grep .... &

После exec стандартный вывод script в целом идет на /some/file. Я редко использую эту технику; Обычно я использую метод { ...; }.

Примечание. Вы должны быть осторожны с обозначением скобок. То, что я показал, будет работать. Пытаясь сгладить его на одну строку, вам нужно обработать {, как если бы это была команда (за которой следует пробел, например), а также для обработки }, как если бы это была команда. У вас должен быть терминатор команд до } - я использовал новую строку, но также работал бы & для фона или ;.

Таким образом:

{ command1;  command2;  } >/some/file
{ command1 & command2 & } >/some/file

Я также не рассмотрел вопрос о том, почему у вас есть две отдельные операции tail -f, запущенные в одном удаленном файле, и почему вы не используете awk power в качестве супер- grep для обработки всего этого в одном - Я только обратился к вопросу о том, как перенаправить ввод/вывод двух команд в один файл.

Ответ 3

Лучший ответ на этот вопрос - вероятно, избавиться от строки ssh .... | grep ... и изменить awk script в другой команде, чтобы добавить функциональность, которую вы получали от команды grep...

Это избавит вас от любых проблем с перемежением в качестве бонусного побочного эффекта.