这是一个简化的makefile示例,它说明了我的问题:
exec:
time (ls > ls.txt; echo $$? > code) 2> time.txt在一个Linux安装下,make运行良好:
Linux-2.6.32-642.4.2.el6.x86_64-x86_64-with-centos-6.8-Final但在我的Ubuntu安装下,它失败了:
Linux-4.4.0-64-generic-x86_64-with-Ubuntu-16.04-xenial并产生以下信息:
/bin/sh: 1: Syntax error: word unexpected (expecting ")")如果我直接从终端运行命令时间就没有问题。
在不同的Linux安装中有不同版本的命令吗?我需要允许一系列命令的版本。
发布于 2017-03-05 15:55:01
Make总是调用/bin/sh来运行菜谱。在某些系统中,/bin/sh是bash的别名,它对标准POSIX (sh)有很多额外的扩展。在其他系统(如Ubuntu)上,/bin/sh是破折号的别名,它是一个更小、更简单、更接近普通POSIX的别名。
Bash有一个内置的time操作,它接受整个管道并显示它所需的时间(在bash命令提示符下运行help time查看文档)。其他shell(如dash )没有内置的time,所以当您运行它时,您将得到程序/usr/bin/time;运行man time查看文档。作为一个单独的程序,它当然不能计时整个管道(因为管道是shell的一个特性);它只能计时一个单独的命令。
你有多种选择:
通过添加以下内容,可以强制makefile始终使用bash作为其shell:
SHELL := /bin/bash干杯。我建议在这里添加一个注释,描述为什么需要专门的bash。
或者,您可以修改您的规则,使其以可移植的方式工作,方法是使shell调用显式化,以便time只有一个命令可以调用:
exec:
time /bin/sh -c 'ls > ls.txt; echo $$? > code' 2>/time.txt发布于 2017-03-05 15:42:28
在“时间”前面加个分号。如前所述,make试图将命令解析为依赖项列表。
发布于 2017-03-07 12:35:16
唯一有效的建议是在我的makefile中强制使用bash:
SHELL := /bin/bash我检查了:在我的Ubuntu机器上,/bin/sh实际上是/bin/dash,而在CentOS机器上是/bin/bash!
谢谢!
https://stackoverflow.com/questions/42609875
复制相似问题