Как я могу узнать, запускается ли make-файл из интерактивной оболочки? - PullRequest
6 голосов
/ 23 ноября 2010

У меня есть make-файл, который запускает команды, которые могут занять некоторое время.Мне бы хотелось, чтобы эти команды были болтливыми, если сборка инициируется из интерактивной оболочки, но тише, если нет (в частности, cron).Что-то вроде (псевдокод):

foo_opts = -a -b -c
if (make was invoked from an interactive shell):
    foo_opts += --verbose

all: bar baz
    foo $(foo_opts)

Это GNU make.Если специфика того, что я делаю, имеет значение, я могу отредактировать вопрос.

Ответы [ 5 ]

7 голосов
/ 23 ноября 2010

Строго не определяется, вызывается ли он из интерактивной оболочки или нет, но для задания cron, в котором выходные данные перенаправляются в файл, ответ на этот вопрос будет таким же, как для Какопределить, выполняется ли мой сценарий оболочки через канал? :

if [ -t 0 ]
then
    # input is from a terminal
fi

Редактировать: Чтобы использовать это для установки переменной в Makefile (в GNU make это):

INTERACTIVE:=$(shell [ -t 0 ] && echo 1)

ifdef INTERACTIVE
# is a terminal
else
# cron job
endif
4 голосов
/ 23 ноября 2010

Я не думаю, что вы можете легко узнать. Я предлагаю принять альтернативную стратегию, возможно, подавив подробный вывод из задания cron. Я хотел бы сделать это с помощью make-файла следующим образом:

VERBOSE = --verbose

foo_opts = -a -b -c ${VERBOSE}

all: bar baz
    foo $(foo_opts)

Затем в задании cron укажите:

make VERBOSE=

Эта спецификация командной строки VERBOSE переопределяет спецификацию в make-файле (и не может быть изменена make-файлом). Таким образом, специальная задача (cron job), которую вы устанавливаете один раз и используете много раз, будет выполнена без подробного вывода; общая задача построения будет выполнена многословно (если вы не решите переопределить многословность в командной строке).

Одно незначительное преимущество этого метода в том, что он будет работать с любым вариантом make; он не зависит от каких-либо средств GNU Make.

4 голосов
/ 23 ноября 2010

http://www.faqs.org/faqs/unix-faq/faq/part5/section-5.html

5.5) Как узнать, запущена ли у меня интерактивная оболочка?

  In the C shell category, look for the variable $prompt.

  In the Bourne shell category, you can look for the variable $PS1,
  however, it is better to check the variable $-.  If $- contains
  an 'i', the shell is interactive.  Test like so:

      case $- in
      *i*)    # do things for interactive shell
              ;;
      *)      # do things for non-interactive shell
              ;;
      esac
0 голосов
/ 23 мая 2017

Просто примечание: вы также можете увидеть соответствующее обсуждение , которое я имел об обнаружении перенаправления STDOUT из Makefile.

Я полагаю, что это будет полезно для читателей этого вопроса - резюме:

-include piped.mk

all:    piped.mk
ifeq ($(PIPED),1)
    @echo Output of make is piped because PIPED is ${PIPED}
else
    @echo Output of make is NOT piped because PIPED is ${PIPED}
endif
    @rm -f piped.mk

piped.mk:
    @[ -t 1 ] && PIPED=0 || PIPED=1 ; echo "PIPED=$${PIPED}" > piped.mk

$ make
Output of make is NOT piped because PIPED is 0

$ make | more
Output of make is piped because PIPED is 1

В своем ответе я объясняю, почему [-t 1] должно быть сделано в действии, а нев присвоении переменной (как в рекомендованном ответе здесь), а также в различных подводных камнях, касающихся переоценки сгенерированного Makefile (то есть piped.mk выше).

Термин интерактивный в этом вопросе подразумевается перенаправление STDIN ... в этом случае замена [ -t 1 ] на [ -t 0 ] в моем коде выше должна работать как есть.

Надеюсь, это поможет.

0 голосов
/ 23 ноября 2010

Я не совсем уверен, что означает "интерактивный".Вы имеете в виду, если у вас есть действительный /dev/tty?Если так, то вы можете это проверить.Большинство из нас проверяют isatty на stdin, потому что оно отвечает на вопросы, которые мы хотим знать: есть ли кто-то, кто что-то печатает.

...