/ bin / sh:-c:第1行:语法错误:文件意外结束(使用Makefile)

时间:2019-02-12 14:46:28

标签: macos makefile newline darwin

我的团队在Makefile的末尾有一个目标,如下所示:

# Fix permissions and ownership problems (only run this in development!)
fixperms:
@if [ $(OS_NAME) == "Linux" ]; then \
    @sudo chown --recursive php:php .
    @sudo chmod --recursive 0777 var/
fi

@if [ $(OS_NAME) == "Darwin" ]; then \
    @sudo chown --recursive php:php .
    @sudo chmod -R 0777 var/
fi

...,并且末尾包含换行符。当我在MacOS机器上运行make fixperms(在Linux上没有尝试过)时,收到以下消息:

  

/ bin / sh:-c:第1行:语法错误:文件意外结束

     

make:*** [fixperms]错误2

我该如何解决?

===

编辑1:我也尝试了没有换行符的结果-结果是相同的。

===

编辑2:我还尝试过重新排列Makefile,以便最后使用另一个目标。运行make fixperms仍然会导致相同的错误。很奇怪。

2 个答案:

答案 0 :(得分:1)

我假设您有TAB在这里缩进您不显示的食谱。

问题是您仅在第一行的末尾加上一个反斜杠,因此这是唯一的“续”行。 Make在单独的外壳中调用配方中的每个逻辑行,因此:

fixperms:
        @if [ $(OS_NAME) == "Linux" ]; then \
            @sudo chown --recursive php:php .
            @sudo chmod --recursive 0777 var/
        fi

运行以下shell命令:

/bin/sh -c 'if [ $(OS_NAME) == "Linux" ]; then @sudo chown --recursive php:php .'
/bin/sh -c 'sudo chmod --recursive 0777 var/'
/bin/sh -c 'fi'

您会看到这些是非法的Shell脚本;您会在第一个错误中遇到错误,因为您错过了fi

您应该将此脚本编写为一个shell命令脚本,并带有反斜杠,以确保逻辑行中包含下一行:

fixperms:
        @if [ $(OS_NAME) == "Linux" ]; then \
            sudo chown --recursive php:php . \
            sudo chmod --recursive 0777 var/ \
        fi
        @if [ $(OS_NAME) == "Darwin" ]; then \
            sudo chown --recursive php:php . \
            sudo chmod -R 0777 var/ \
        fi

(请注意,在脚本中间删除@以及那些是makefile配方的元字符,并且仅在配方开始时才能识别它们。)

我实际上认为您应该删除所有@。至少在使makefile能够100%工作之前,添加它们始终是致命的错误,因为您会丢弃重要的信息,否则这些信息会帮助您进行调试。例如,如果您在这里没有它们,则会看到将要调用的行打印出来,这可能有助于您了解问题所在。

您可能会考虑:http://make.mad-scientist.net/managing-recipe-echoing/

答案 1 :(得分:0)

我从没能使shell条件语句正常工作。我切换到使用Makefile条件语句,这似乎已经完成了工作。所以我现在有这个:

# Fix permissions and ownership problems (only run this in development!)
fixperms:
ifeq ("$(OS_NAME)", "Linux")
    sudo chown --recursive php:php . ; sudo chmod --recursive 0777 var/
endif
ifeq ("$(OS_NAME)", "Darwin")
    sudo chown -R php:php . ; sudo chmod -R 0777 var/
endif

...看起来效果很好。