通常从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中的所有颜色代码。
发布于 2013-07-19 19:36:32
您不能为此使用$(shell ...),因为$(shell ...)的输出总是被重定向的:这必须是因为运行$(shell ...)的全部目的是为了让make捕获它的输出。你可以检查stderr是否是tty,假设人们通常同时重定向它们。然而,在某些情况下,这可能是一个有缺陷的假设。
除此之外,我没有看到在make中执行此检查的直接方法。检查必须在make配方中完成,因为这是make在不修改其stdout的情况下调用shell的惟一位置。但是你不能在菜谱中改变makefile变量等。
通过使用自动生成的包含文件,我们可能会想出一个非常令人厌恶的方法,其中包含文件的构建会检查stdout是否是终端,并将变量赋值写入包含的makefile中。然后,诀窍是让这个包含的makefile在每次调用make时只重新构建一次,这并不容易,但可能是可以做到的。但是,这将涉及每次完全重新执行make,仅仅是为了设置这个变量。
当然,您还可以提供一个人们可以运行的shell包装器,而不是直接运行make,它测试stdout是否是tty,然后根据结果使用变量赋值调用make。
https://stackoverflow.com/questions/17740794
复制相似问题