Я хотел бы протестировать в моем bash script, где stdout и stderr направлены, или, точнее, если они были перенаправлены.
У вас есть идея?
Переменная $*
bash не дает мне эту информацию.
Я хотел бы протестировать в моем bash script, где stdout и stderr направлены, или, точнее, если они были перенаправлены.
У вас есть идея?
Переменная $*
bash не дает мне эту информацию.
Вы должны иметь возможность использовать тестовый переключатель -t
, чтобы определить, являются ли выходные потоки tty
или нет:
if [ -t 1 ] ; then
echo stdout is a terminal
else
echo stdout is not a terminal
fi
Используйте -t 0
для stdin
.
Используйте -t 2
для stderr
.
Технически нет способа сказать, перенаправлены ли stdin/stdout/stderr, потому что вы не знаете, что вызывает ваш script. Если он не вызывается из другой оболочки, нет понятия "перенаправление".
Все, что вам нужно сделать, это типы дескрипторов ввода/вывода/err (терминалы, fifo, pipe, device, file и т.д.). Обычно вы просто хотите определить, будет ли ваш выход на какой-то экран пользователя или будет ли он другим процессом. В этом случае используйте [ -t 1 ]
в соответствии с ответом Мата.
Если вы хотите узнать, где/на что был перенаправлен ваш процесс, изучите цели символических ссылок /proc/$$/fd/1
и /proc/$$/fd/2
.
Обратите внимание, что кто-то может подключить вывод вашего процесса к другому терминалу с помощью ./myscript.sh > /dev/pts/1234
. Тогда это будет "перенаправлено", но stdout все равно будет терминалом.
Примеры:
$ ls -l /proc/$$/fd/1 > results
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0
$ cat results
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798]
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0
[ -t 1 ]
будет истинным для 1-го и 4-го из них.