Я хочу разделить stdout так, чтобы он печатался как на stdout, так и на stderr. Это звучит как задание для tee, но синтаксис уклоняется от меня -
./script.sh | tee stderr
Конечно, как следует называть stderr здесь?
Ответ 1
./script.sh | tee /dev/fd/2
Обратите внимание, что это зависит от поддержки ОС, а не от встроенной мощности в тройнике, поэтому не универсальна (но будет работать на MacOS, Linux, Solaris, FreeBSD, возможно, на других).
Ответ 2
Единственный метод кросс-платформы, который я нашел, который работает как в интерактивных, так и в неинтерактивных оболочках:
command | tee >(cat 1>&2)
Аргумент для tee - это дескриптор файла или файла. Используя замену процесса, мы отправляем результат в процесс. В процессе = cat = мы перенаправляем stdout в stderr. Оболочка (bash/ksh) отвечает за настройку дескрипторов файлов 1 и 2.
Ответ 3
./script.sh 2>&1 >/dev/null | tee stderr.out
Это открывает STDERR для STDOUT, а затем удаляет STDOUT.