1

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

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

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

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

但是,无论输出是否重定向到文件,这种情况似乎一直存在。我想这取决于如何$(shell...)实施。所以我的问题是,有什么我可以测试的东西make会让我知道输出是否被重定向到文件。

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

4

1 回答 1

1

你不能用$(shell ...)这个,因为输出$(shell ...)总是被重定向:它必须是因为运行的全部$(shell ...)目的是让 make 捕获它的输出。您可以检查 stderr 是否是 tty,假设人们通常同时重定向它们。然而,在某些情况下,这可能是一个有缺陷的假设。

除此之外,我看不到从 make 内部执行此检查的简单方法。检查必须在 make 配方中完成,因为这是 make 调用 shell 而不修改其标准输出的唯一地方。但是您不能从配方中更改 makefile 变量等。

通过使用自动生成的包含文件,我们可能会想出一个非常恶心的 hack,其中包含文件的构建检查 stdout 是否是终端,并将变量赋值写入包含的 makefile。然后诀窍是每次调用 make 时都要重新构建这个包含的 makefile,这并不容易,但可能可以做到。但是,这将涉及每次完全重新执行 make ,只是为了设置这个变量。

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

于 2013-07-19T11:36:32.387 回答