【问题标题】:In makefile when I use inside bash function if statement it's throw error在makefile中,当我在bash函数中使用if语句时,它会抛出错误
【发布时间】:2020-01-18 18:10:42
【问题描述】:

在makefile中,当我在bash函数中使用if语句时会抛出错误

test : 
        foo() { if [[ "a" == "a" ]] ; then echo $$1 ; fi ; } ; foo "hello"

错误

/bin/sh: 1: [[: 未找到

或与一个 [

test : 
        foo() { if [ "a" == "a" ] ; then echo $$1 ; fi ; } ; foo "hello"

错误

/bin/sh: 1: [:a: 意外操作符

在这种情况下如何使用 if 语句

【问题讨论】:

    标签: bash makefile


    【解决方案1】:

    您正在使用特定于 bash 的功能。 Make 不运行用户的 shell,默认情况下它总是使用/bin/sh。在某些系统上,/bin/sh 是指向/bin/bash 的链接,并且您的 makefile 可以工作。在其他系统上,/bin/sh 是指向 POSIX shell 的链接,例如 dash

    POSIX 不允许[[ ... ]],它只使用[ ... ]。此外,在 POSIX 测试中,相等是 = 而不是 ==。只有 bash 允许 == 作为扩展名。

    因此,如果您希望您的命令符合 POSIX 标准,它必须是:

    test : 
            foo() { if [ "a" = "a" ]; then echo $$1; fi; }; foo "hello"
    

    【讨论】:

    • “总是”不准确。请参阅我关于如何使用不同外壳的回复。
    • 我将声明更改为始终使用/bin/sh *默认情况下*,这就是我的意思。感谢您的来信。
    • 仅供参考,并非所有系统都提供/bin/bash。我总是更喜欢简单地使用 POSIX sh 功能编写我的食谱,除非 bash 提供的东西非常有用,它有理由成为要求。
    【解决方案2】:

    看来/bin/sh 不是/bin/bash。您需要在 Makefile 中设置 shell:

    SHELL = /bin/bash
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2019-01-18
      • 2015-01-05
      • 2017-10-28
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多