Как я могу знать внутри сценария, если STDOUT был перенаправлен для него?

Вам потребуется установить Compiz из репозитория EPEL .

0
29.01.2019, 20:00
2 ответа

В 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
1
28.01.2020, 02:23

В общем, нельзя. Перенаправления не отображаются в качестве аргументов выполняемой команды. Даже если бы они это сделали, вы не смогли бы сказать, куда идет вывод скрипта во всех случаях. Рассмотрим эти два:

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каждый раз, когда он запускает его вручную.)

2
28.01.2020, 02:23

Теги

Похожие вопросы