Я хочу разделить stdout
, чтобы он печатался как в stdout
, так и в stderr
. Звучит как работа для tee
, но синтаксис ускользает от меня -
./script.sh | tee stderr
Конечно, как на самом деле здесь следует ссылаться на stderr
?
Я хочу разделить stdout
, чтобы он печатался как в stdout
, так и в stderr
. Звучит как работа для tee
, но синтаксис ускользает от меня -
./script.sh | tee stderr
Конечно, как на самом деле здесь следует ссылаться на stderr
?
./script.sh | tee /dev/fd/2
Обратите внимание, что это зависит от поддержки ОС, а не от встроенного питания в тройнике, поэтому не универсален (но будет работать на MacOS, Linux, Solaris, FreeBSD и, возможно, на других).
open()
).
- person Nicholas Wilson; 10.12.2012
bash
подразумевает, что она принимает /dev/fd/2
в качестве имени файла для файлового дескриптора 2, даже если файловая система не имеет такого файла.
- person chepner; 10.12.2012
bash
, так что здесь это не играет роли.
- person Nicholas Wilson; 10.12.2012
tee
.
- person chepner; 11.12.2012
/dev/fd/2
. Например, если вы войдете в систему как root
, ваш терминал будет принадлежать root
. Затем, если вы смените пользователя, у вас не будет доступа к /dev/fd/2
.
- person Michał Górny; 06.09.2013
/proc/self/fd/2
может быть что-то доступно. фактически, в моей системе [CentOS6] /dev/fd
является символической ссылкой на /proc/self/fd
.
- person Sammitch; 04.05.2016
Единственный найденный мной кроссплатформенный метод, который работает как в интерактивных, так и в неинтерактивных оболочках:
command | tee >(cat 1>&2)
Аргумент tee - это файл или дескриптор файла. Используя подстановку процесса, мы отправляем результат процессу. В process = cat = мы перенаправляем stdout на stderr. Оболочка (bash / ksh) отвечает за настройку файловых дескрипторов 1 и 2.
#!/bin/bash
, если он запускается в сценарии. Поскольку sh
не поддерживает >( xxxx )
- person Sungam; 01.01.2021
./script.sh 2>&1 >/dev/null | tee stderr.out
Это открывает STDERR для STDOUT, а затем удаляет STDOUT.
/dev/null
.
- person Lex R; 28.07.2016
/dev/stderr
. Я не встречал системы с/dev/fd
, в которой также не было бы/dev/std{in,out,err}
, но это не значит, что их не существует. В Mac OS X 10.7.5 есть и то, и другое; В Solaris есть и то, и другое; В Linux есть и то, и другое. В AIX 6 нет ни того, ни другого; HP-UX 11.00 не имеет ни того, ни другого. - person Jonathan Leffler   schedule 10.12.2012bash
принимает/dev/stderr
как синоним стандартной ошибки независимо от того, существует ли файл в файловой системе; это особый случай. - person chepner   schedule 10.12.2012/dev/fd/2
и/dev/stderr
; Руководство bash по перенаправлениям: Bash обрабатывает несколько имен файлов специально, когда они используются в перенаправлениях , ... - person Joel Purra   schedule 28.11.2013