首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从GNU make内部检测输出是否被重定向到文件?

是否可以从GNU make内部检测输出是否被重定向到文件?
EN

Stack Overflow用户
提问于 2013-07-19 15:49:30
回答 1查看 340关注 0票数 1

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

代码语言:javascript
复制
if [ -t 1 ]; then echo "shell"; fi

但是,我想在makefile中做这件事,这意味着AFAIK,唯一的方法是:

代码语言:javascript
复制
ifeq ($(shell if [ -t 1 ]; then echo "1"; fi),1)
## in shell
endif

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17740794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档