【问题标题】:Execution error in a makefile生成文件中的执行错误
【发布时间】:2017-07-25 09:26:10
【问题描述】:

这是一个简化的 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 安装中是否有不同版本的命令?我需要允许一系列命令的版本。

【问题讨论】:

    标签: linux ubuntu time makefile syntax-error


    【解决方案1】:

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

    SHELL := /bin/bash
    

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

    谢谢!

    【讨论】:

    • 顺便说一句,明确调用 shell 的建议并未将输出文件重定向到“time.txt”。
    【解决方案2】:

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

    Bash 有一个内置的time 操作,它接受整个管道并显示它所花费的时间(在 bash shell 命令提示符下运行help time 以查看文档)。其他 shell 像 dash 没有内置的 time,所以当你运行它时,你会得到程序 /usr/bin/time;运行 man time 以查看文档。作为一个单独的程序,它当然不能为整个管道计时(因为管道是 shell 的一个特性);它只能计时一个单独的命令。

    您有多种选择:

    您可以通过添加以下内容来强制您的 makefile 始终使用 bash 作为其外壳:

    SHELL := /bin/bash
    

    到它。我建议在那里添加一条评论,并描述为什么特别需要 bash。

    或者您可以修改您的规则以通过明确调用 shell 来以可移植的方式工作,以便 time 只有一个命令可以调用:

    exec:
            time /bin/sh -c 'ls > ls.txt; echo $$? > code' 2>/time.txt
    

    【讨论】:

      【解决方案3】:

      在“时间”前面加一个分号。照原样,make 正在尝试将您的命令解析为依赖项列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-06
        • 2011-09-16
        • 1970-01-01
        • 2015-04-26
        相关资源
        最近更新 更多