Тестирование stdout и stderr в bash script - программирование
Подтвердить что ты не робот

Тестирование stdout и stderr в bash script

Я хотел бы протестировать в моем bash script, где stdout и stderr направлены, или, точнее, если они были перенаправлены.

У вас есть идея?

Переменная $* bash не дает мне эту информацию.

4b9b3361

Ответ 1

Вы должны иметь возможность использовать тестовый переключатель -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.

Ответ 2

Технически нет способа сказать, перенаправлены ли 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-го из них.