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