代码之家  ›  专栏  ›  技术社区  ›  Frank

如何在Makefile目标中使用Bash语法?

  •  169
  • Frank  · 技术社区  · 15 年前

    我经常发现 Bash diff <(sort file1) <(sort file2) .

    file-differences:
        diff <(sort file1) <(sort file2) > $@
    

    在我的GNU Make 3.80中,这将给出一个错误,因为它使用 shell bash 执行命令。

    5 回复  |  直到 8 年前
        1
  •  441
  •   derobert    8 年前

    从GNU Make文档中,

    5.3.1 Choosing the Shell
    ------------------------
    
    The program used as the shell is taken from the variable `SHELL'.  If
    this variable is not set in your makefile, the program `/bin/sh' is
    used as the shell.
    

    所以说 SHELL := /bin/bash

    顺便说一句:你也可以为一个目标做这件事,至少是为GNUmake。每个目标都可以有自己的变量分配,如下所示:

    all: a b
    
    a:
        @echo "a is $$0"
    
    b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
    b:
        @echo "b is $$0"
    

    这将打印:

    a is /bin/sh
    b is /bin/bash
    

        2
  •  22
  •   Chris Lutz    15 年前

    你可以打电话 bash -c 旗帜:

    bash -c "diff <(sort file1) <(sort file2) > $@"
    

    -bash: $@: ambiguous redirect 作为一条错误消息,所以在深入讨论之前,您可能希望了解一下(尽管我使用的是Bash3.2.something,所以您的工作方式可能不同)。

        3
  •  4
  •   Menno Smits    14 年前

        4
  •  4
  •   paxdiablo    7 年前

    您可以在Makefile中直接调用bash,而不是使用默认shell:

    bash -c "ls -al"
    

    而不是:

    ls -al
    
        5
  •  4
  •   Nicolas Marshall    5 年前

    一种同样有效的方法是将其放在目标的第一行:

    your-target: $(eval SHELL:=/bin/bash)
        @echo "here shell is $$0"
    
        6
  •  2
  •   Bill G    7 年前

    有一种方法可以做到这一点,而无需显式地将SHELL变量设置为指向bash。如果您有许多makefiles,这将非常有用,因为SHELL不是由后续makefiles继承的,也不是从环境中获取的。您还需要确保编译代码的任何人都以这种方式配置他们的系统。

    sudo dpkg-reconfigure dash 如果对提示回答“否”,系统将不会使用dash作为默认shell。然后它将指向bash(至少在Ubuntu中是这样)。请注意,使用dash作为系统外壳会更有效。

        7
  •  0
  •   Ilya Bystrov    3 年前

    makeit 使用bash语法进行有限的Makefile替换,在某些情况下可能很有用 (我是作者)

    • 自动完成功能

    while 脚本末尾的循环:

    while [ $# != 0 ]; do
      if [ "$(type -t $1)" == 'function' ]; then
        $1 
      else
        exit 1
      fi 
      shift
    done
    

    https://asciinema.org/a/435159