首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成文件中的执行错误

问生成文件中的执行错误
EN

Stack Overflow用户
提问于 2017-03-05 14:58:52
回答 3查看 557关注 0票数 0

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

代码语言:javascript
复制
exec:
    time (ls > ls.txt; echo $$? > code) 2> time.txt

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

代码语言:javascript
复制
Linux-2.6.32-642.4.2.el6.x86_64-x86_64-with-centos-6.8-Final

但在我的Ubuntu安装下,它失败了:

代码语言:javascript
复制
Linux-4.4.0-64-generic-x86_64-with-Ubuntu-16.04-xenial

并产生以下信息:

代码语言:javascript
复制
/bin/sh: 1: Syntax error: word unexpected (expecting ")")

如果我直接从终端运行命令时间就没有问题。

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

EN

回答 3

Stack Overflow用户

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

代码语言:javascript
复制
SHELL := /bin/bash

干杯。我建议在这里添加一个注释,描述为什么需要专门的bash。

或者,您可以修改您的规则,使其以可移植的方式工作,方法是使shell调用显式化,以便time只有一个命令可以调用:

代码语言:javascript
复制
exec:
        time /bin/sh -c 'ls > ls.txt; echo $$? > code' 2>/time.txt
票数 2
EN

Stack Overflow用户

发布于 2017-03-05 15:42:28

在“时间”前面加个分号。如前所述,make试图将命令解析为依赖项列表。

票数 0
EN

Stack Overflow用户

发布于 2017-03-07 12:35:16

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

代码语言:javascript
复制
SHELL := /bin/bash

我检查了:在我的Ubuntu机器上,/bin/sh实际上是/bin/dash,而在CentOS机器上是/bin/bash!

谢谢!

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

https://stackoverflow.com/questions/42609875

复制
相关文章

相似问题

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