你能通过环境模拟“set -e”和“set -x”吗?

时间:2011-03-02 12:30:32

标签: shell automake sh

我的许多测试脚本都开始了:

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

我没有在每个脚本中放置这些行(或采用通用脚本) 喜欢通过环境获得该功能。是否有一种可移植的方式来使用环境设置来使sh表现得好像已经调用了“set -e”或“set -x”?是否有非便携式(即特定于shell)的方式来做同样的事情?

(我已经将这个问题标记为automake,因为这是我现在所处的框架,并且希望能够在TESTS_ENVIRONMENT中添加一些内容,这将允许我省略每个脚本中的那些行,但显然是问题不是特定于汽车的。)

2 个答案:

答案 0 :(得分:3)

只需将其添加到您的脚本中:

eval "${ENABLE_DEBUG}"

现在您可以将env变量ENABLE_DEBUG设置为set -e ; test -n "$V" && set -x以启用调试,或者您可以将其设置为未设置。

请注意,如果您有“未定义变量失败”选项处于活动状态(set -uset -o nounset),则会失败。如果是这种情况,您需要检查变量是否已设置或使用bash:

eval "${ENABLE_DEBUG}"

将变量设置为:,“不执行任何操作”命令。

答案 1 :(得分:1)

回答automake部分。

如果你有

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
        ...

您实际上可以将TEST_ENVIRONMENT设置为一个命令,该命令将使用sh -xesh -e启动您的shell脚本。

如果所有测试都是shell脚本,那么这可以设置为

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

如果不是所有测试都是shell脚本,那么可以

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