我的团队在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
仍会导致相同的错误。很奇怪。
我假设你有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/
我从来没有能够让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
......似乎运作良好。