这是一个简化的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安装中是否有不同版本的命令?我需要允许一系列命令的版本。
答案 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作为其shellSHELL := /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!
谢谢!