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