Проверьте перенаправление stdout и stderr в скрипте bash - PullRequest
16 голосов
/ 18 февраля 2012

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

У тебя есть идея?

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

Ответы [ 2 ]

26 голосов
/ 18 февраля 2012

Технически нет способа определить, перенаправлены ли stdin / stdout / stderr, потому что вы не знаете, что вызывает ваш скрипт.Если он не вызывается из другой оболочки, понятие «перенаправление» отсутствует.

Все, что вам нужно, это указать, какие типы дескрипторов файлов in / out / err (терминал, fifo, pipe, устройство, файл и т. д.).Обычно вы просто хотите определить, идет ли ваш вывод на экран какого-либо пользователя или же на другой процесс.В этом случае используйте [ -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-го из них.

22 голосов
/ 18 февраля 2012

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

...