makefile中的执行错误

时间:2017-03-05 14:58:52

标签: linux ubuntu time makefile syntax-error

这是一个简化的makefile示例,说明了我的问题:

exec:
    time (ls > ls.txt; echo $$? > code) 2> time.txt

make exec 在一个Linux安装下运行良好:

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 ")")

如果我直接从终端运行命令 time ,则没有问题。

在不同的Linux安装中是否有不同版本的命令?我需要允许一系列命令的版本。

3 个答案:

答案 0 :(得分:2)

Make总是调用/bin/sh来运行配方。在某些系统上,/bin/sh是bash的别名,它对标准POSIX shell(sh)有很多额外的扩展。在其他系统(如Ubuntu)上,/bin/sh是dash的别名,它更小,更简单,更接近普通的POSIX shell。

Bash有一个内置的time操作,它接受整个管道并显示它所花费的时间(在bash shell命令提示符下运行help time以查看文档)。像dash这样的其他shell没有内置的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

答案 1 :(得分:0)

在“时间”前加一个分号。因此,make试图将您的命令解析为依赖项列表。

答案 2 :(得分:0)

唯一有效的建议是在我的makefile中强制使用bash:

SHELL := /bin/bash

我检查过:在我的Ubuntu机器上,/ bin / sh真的是/ bin / dash,而在CentOS机器上它是/ bin / bash!

谢谢!