是否有可能从GNU内部检测输出是否重定向到文件?

时间:2013-07-19 07:49:30

标签: makefile gnu-make

通常,从shell脚本中,我们可以检测输出是否被重定向到文件,如下所示:

if [ -t 1 ]; then echo "shell"; fi

但是,我想在makefile中执行此操作,这意味着AFAIK,唯一的方法是:

ifeq ($(shell if [ -t 1 ]; then echo "1"; fi),1)
## in shell
endif

但是,无论输出是否重定向到文件,似乎都是这种情况。我想这取决于$(shell...)的实施方式。所以我的问题是,我可以在make中测试一下,如果输出重定向到文件,我会告诉我。

一点点背景,我的makefile生成了大量有用的输出并且使事情变得更加明显,我使用了一些文本着色 - 在控制台上这很好,但是在Hudson中,当相同的构建作业运行时,输出(重定向到一个文件)其中包含所有控制字符...所以我想做的是在重定向文件时禁用make中的所有颜色代码。

1 个答案:

答案 0 :(得分:1)

你不能使用$(shell ...),因为$(shell ...)的输出始终重定向:它必须是因为整个运行点{{1}是为了捕获它的输出。你可以检查stderr是否是tty,假设人们通常同时重定向它们。然而,在某些情况下,这可能是一个有缺陷的假设。

除此之外,我没有看到从make内部执行此检查的简单方法。检查必须在make配方中完成,因为这是make在不修改stdout的情况下调用shell的唯一地方。但是你不能在配方中改变makefile变量等。

我们可以通过使用自动生成的包含文件来提出真的恶心的黑客,其中检查包含文件的构建以查看stdout是否是终端并将变量赋值写入包含的makefile。然后诀窍是让每个make调用都包含makefile重新编译一次,这不容易但可能会完成。但是,这将涉及每次完全重新执行make,只需设置此变量。

当然你也可以提供一个shell包装器,人们可以运行而不是直接运行make,它测试了stdout是否为tty然后根据结果调用了变量赋值make。