【问题标题】:How to handle shell expansions in GNU Make under Ubuntu?如何在 Ubuntu 下处理 GNU Make 中的 shell 扩展?
【发布时间】:2011-10-04 15:04:50
【问题描述】:

鉴于这个非常简单的Makefile

all:
    @mkdir -pv test/{a,b}

我在 OS X 10.6.8 和 CentOS 5.5 上得到这个输出:

mkdir: created directory `test'
mkdir: created directory `test/a'
mkdir: created directory `test/b'

但是在 Ubuntu 11.04 上我得到了这个:

mkdir: created directory `test'
mkdir: created directory `test/{a,b}'

在所有平台上的 shell 中手动运行命令 mkdir -pv test/{a,b} 会得到预期的结果。

GNU Make 的版本在所有平台上都是相同的:

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program is built for [PLATFORM]

在 Ubuntu 下有什么不同,为什么 shell 扩展在那里不起作用?

【问题讨论】:

    标签: bash ubuntu makefile gnu-make brace-expansion


    【解决方案1】:

    问题可能是 Make 生成 /bin/sh。它通常是系统默认 shell 的符号链接。

    选项 1

    您可以确保它指向 bash(因为这是一种 bashism)。可能现在是 /bin/dash 或 /bin/sh,具体取决于您的 Ubuntu 版本。

    选项 2

    更简单的选择:

    SHELL=/bin/bash
    
    all:
        @echo a{3,4}
        @bash -c 'echo a{3,4}'
    

    除非您注释掉 SHELL= 行,否则这会打印两次相同的输出

    选项 3

    如果您不能/不想修改 make 文件,您可以像这样调用它:

    make SHELL=/bin/bash
    

    注意与子 makefile 或包含的交互。您可能想查看 make -e 选项和 make export 关键字:http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html

    【讨论】:

    • 就是这样。我们有应该在所有这些不同平台上运行的 makefile,因此设置 SHELL 变量是要走的路。
    【解决方案2】:

    我已经很久很久没有使用 Make...

    有几种方法可以指定要使用的特定 shell。旧 Make 的默认 shell 是原始的 Bourne shell。如果你想要一个不同的 shell,你必须自己设置。

    您使用的是 Linux 和 GNU,所以我假设您使用 BASH 作为默认 shell。在你的 Make 中试试这个命令:

    echo "random = $RANDOM"
    

    如果这只是打印random = 并且不包含随机数,则您的 Make 使用 Bourne shell 作为其默认 shell 而不是 BASH。 (这很奇怪,因为我认为 Linux 中没有真正的 Bourne shell...)要解决这个问题:

    • 您可以添加一个指向 BASH shell 的 SHELL 宏。
    • 您可以在命令中包含 shell。

    代替:

    @mkdir -pv test/{a,b}
    

    把这个:

    /bin/bash -c @mkdir -pv test/{a,b}
    

    这指定您要使用 BASH 而不是标准的 /bin/sh Bourne shell。

    如果echo random = $RANDOM 确实打印了一个随机数,那么您使用的是 BASH(或至少是 Kornshell),但可能未设置 BRACE EXPANSION。尝试在您的 Makefile 中使用它:

    set -o
    

    并确保braceexpand 已开启。运行 Make 时它可能会关闭。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多