Специальный трубопровод / перенаправление в Баш

(Сначала я искал час, поэтому я уверен, что это не повторение)

Мне нужно написать скрипт, который выполняет 1 команду, 1 раз, а затем делает следующее:

  1. Сохраняет как stdout, так и stderr в файл (сохраняя их правильный порядок)
  2. Сохраняет stderr только в переменную.

Проработка в пункте 1, если у меня есть файл, как это

echo "one"
thisisanerrror
echo "two"
thisisanotherError

Я должен ожидать увидеть вывод, сопровождаемый ошибкой, сопровождаемый выводом, сопровождаемым большим количеством ошибки (таким образом, сцепление не достаточно).

Самое близкое, что я получил, это следующее, которое, кажется, повредило файл журнала:

errs=`((./someCommand.sh 2>&1 1>&3) | tee /dev/stderr ) 3>file.log 2>&3 `

1 ответ

Это может быть отправной точкой:

Как мне написать stderr в файл при использовании "тройника" с каналом?

Редактировать:

Это похоже на работу:

((./foo.sh) 2> >(tee >(cat) >&2)) > foo.log

Разделите stderr на tee, запишите одну копию в stdout (cat) и запишите другую в stderr. После этого вы можете взять весь стандартный вывод и записать его в файл.

Редактировать: сохранить вывод в переменной

varx=`((./foo.sh) 2> >(tee >(cat) >&2))`

Я также видел команду, заключенную в дополнительные двойные кавычки, но я понятия не имею, для чего это может быть полезно.

Другие вопросы по тегам