В AIX дескриптор файла stdout доступен по адресу /proc/$$/fd/1
, поэтому вы можете проверить, является ли он обычным файлом или нет:
if [ -f /proc/$$/fd/1 ]
then
echo stdout has already been redirected
else
echo redirecting stdout
exec 1>file
echo some output
fi
/bin/sh жестко связан с /bin/ksh, поэтому вы получите одинаковое поведение в любой оболочке.
Вы можете отдельно проверить перенаправление stdout на /dev/null, если хотите:
if [ /proc/$$/fd/1 -ef /dev/null ]; then :...; fi
В общем, нельзя. Перенаправления не отображаются в качестве аргументов выполняемой команды. Даже если бы они это сделали, вы не смогли бы сказать, куда идет вывод скрипта во всех случаях. Рассмотрим эти два:
bash -c 'somecmd > /dev/null; othercmd'
и
bash -c 'somecmd; othercmd' > /dev/null
В первом случае вывод somecmd
перенаправляется на /dev/null
, но во втором случае перенаправляется вывод всей оболочки, включая somecmd
и othercmd
. Видя командную строку somecmd
во втором случае, нельзя сказать, как перенаправляется вывод.
Тем не менее, похоже, что ловушка Баша DEBUG
может быть использована для этого.
$ trap 'export CMDLINE=$BASH_COMMAND' DEBUG
$ env 2>/dev/null |grep CMD
CMDLINE=env 2> /dev/null
Ловушка экспортирует команду для запуска как CMDLINE
, которая, как мы видим, экспортируется, поскольку она отображается в выводе env
. Обратите внимание, что показан не весь конвейер, а только одна команда.
Тем не менее, в большинстве случаев есть лучшие способы справиться с проблемами, чем пытаться -угадывать перенаправления пользователя. Многие команды проверяют, идет ли вывод на терминал, и меняют свое поведение в зависимости от этого.
Чтобы проверить, является ли стандартный вывод терминалом, вы можете использовать[ -t 1 ]
:
$ if [ -t 1 ]; then echo terminal; else echo not terminal; fi |cat
not terminal
Это чаще всего используется для отключения некоторых интерактивных функций или постороннего вывода в случае, если вывод не поступает на терминал и, следовательно, по предположению, к пользователю.
Если просто проверить, указывает ли файловый дескриптор на терминал, недостаточно, может быть проще организовать передачу дополнительного аргумента в программу, чтобы сообщить ей, в каком режиме работать.вместо того, чтобы заботиться о перенаправлениях, пусть программа делает одно, если запускается с someprog --mode=cron
, другое, если запускается с someprog --mode=batch
, и запускается в интерактивном режиме, если запускается без аргумента --mode
. (Сделайте интерактивный режим или режим командной строки по умолчанию, чтобы пользователю не приходилось вручную вводить --mode=commandline
каждый раз, когда он запускает его вручную.)