Можете ли вы эмулировать "set -e" и "set -x" через окружение? - PullRequest
0 голосов
/ 02 марта 2011

Многие из моих тестовых сценариев начинаются:

set -e
test -n "$V" && set -x

Вместо того, чтобы вставлять эти строки (или создавать общий сценарий) в каждом сценарии, я хотел бы получить эту функциональность через среду.Существует ли переносимый способ использования настроек среды, чтобы sh вел себя так, как если бы был вызван "set -e" или "set -x"?Есть ли непереносимый (то есть специфичный для оболочки) способ сделать то же самое?

(я пометил этот вопрос как automake, потому что это среда, в которой я сейчас работаю и хотел бы иметь возможностьпоместить что-то в TESTS_ENVIRONMENT, что позволит мне пропустить эти строки в каждом скрипте, но ясно, что вопрос не является автоматическим.)

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Просто добавьте это в свои скрипты:

eval "${ENABLE_DEBUG}"

Теперь вы можете установить переменную env ENABLE_DEBUG в set -e ; test -n "$V" && set -x, чтобы включить отладку, или оставить ее неустановленной.

Примечаниечто это терпит неудачу, если у вас активна опция «сбой для неопределенных переменных» (set -u или set -o nounset).Если это так, вам нужно либо проверить, установлена ​​ли переменная, либо использовать bash с:

eval "${ENABLE_DEBUG}"

, который устанавливает переменную на :, командой "do nothing".

1 голос
/ 10 марта 2011

Ответ на вопрос автозапчастей.

Если у вас есть

TESTS = foo.test bar.test baz.test

, сгенерированный Makefile будет иметь цель test примерно как

test:
        ...
        $(TEST_ENVIRONMENT) $(srcdir)/foo.test
        $(TEST_ENVIRONMENT) $(srcdir)/bar.test
        $(TEST_ENVIRONMENT) $(srcdir)/baz.test
        ...

Youможет на самом деле установить TEST_ENVIRONMENT для команды, которая будет запускать ваши сценарии оболочки с sh -xe или sh -e.

Если все тесты являются сценариями оболочки, это может быть просто, как установка

TEST_ENVIRONMENT = $(SHELL) -e $${V+-x}

если не все тесты являются сценариями оболочки, вы можете иметь

TEST_ENVIRONMENT = $(srcdir)/run

и написать сценарий run, например:

#!/bin/sh
case $1 in
  *.py)
    exec python "$@";;
  *.test)
    exec sh -x ${V+-x} "$@";;
  *)
    echo "Unknown extension" >&2
    exit 2;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...