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

问题描述 投票:0回答:2

我的团队在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

......最后还包括换行符。当我运行make fixperms(在我的macOS机器上 - 我还没有在Linux上试过它)时,我得到以下消息:

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

make:*** [fixperms]错误2

我怎样才能解决这个问题?

===

编辑1:我也尝试过没有换行 - 结果是一样的。

===

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

macos makefile newline darwin
2个回答
1
投票

我假设你有TAB在这里缩进你的食谱,你没有显示。

问题是你只在第一行的末尾有一个反斜杠,所以这是唯一的“继续”行。 Make在单独的shell中调用配方中的每个逻辑行,所以这样:

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%工作之前添加它们总是一个致命的错误,因为你丢弃了可以帮助你调试的关键信息。例如,如果您没有在这里使用它们,您会看到make打印出它要调用的行,它可能帮助您了解问题所在。

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


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

......似乎运作良好。

© www.soinside.com 2019 - 2024. All rights reserved.