If statement 从sh语法到Makefile语法的条件
我有一个特定的文件UPDATE.sh。这个文件的任务是使用git merge更新我的程序 UPDATE.sh:If statement 从sh语法到Makefile语法的条件,if-statement,github,makefile,sh,gnu-make,If Statement,Github,Makefile,Sh,Gnu Make,我有一个特定的文件UPDATE.sh。这个文件的任务是使用git merge更新我的程序 UPDATE.sh: #!/usr/bin/env bash git fetch https://xxxxx newUpdatesAvailable=`git diff HEAD FETCH_HEAD` if [[ "$newUpdatesAvailable" != "" ]] then git branch backup git checkout backup
#!/usr/bin/env bash
git fetch https://xxxxx
newUpdatesAvailable=`git diff HEAD FETCH_HEAD`
if [[ "$newUpdatesAvailable" != "" ]]
then
git branch backup
git checkout backup
git add .
git add -u
git commit -m date "+%d.%m.%Y"
git checkout master
git merge FETCH_HEAD
else
echo "No updates..."
fi
我必须写同样的东西,但在Make语法上
我试图找出Make中的条件,但对我来说不起作用
请告诉我如何在不使用以下命令的情况下在Makefile中正确写入此命令:
update:
./UPDATE.sh
您不需要捕获git diff的输出;你只需要知道是否存在差异。使用
-q
选项
if ! git diff -q HEAD FETCH_HEAD; then
git branch backup
...
else
echo "No updates"
fi
-q
抑制输出并暗示--exit code
,如果存在差异,将导致git diff
以非零退出状态退出
在Makefile中,这将是
.PHONY: update
update:
git fetch https://xxxxx
if ! git diff -q HEAD FETCH_HEAD; then \
git branch backup && \
git checkout backup && \
git add . && \
git add -u && \
git commit -m date "+%d.%m.%Y" && \
git checkout master && \
git merge FETCH_HEAD; \
else \
echo "No updates"; \
fi
分号和反斜杠是必要的,因为整个
if
语句必须出现在一个逻辑行上。另一个不需要大量引用、分号等的替代方法是利用这样一个事实,即当退出代码为非零时,make将停止执行规则
这通常会使Makefile更易于维护,规则也更简单
update:
git fetch https://xxxxx
git diff -q HEAD FETCH_HEAD || { echo "No Update" ; false ; }
git branch backup
git checkout backup
git add .
git add -u
git commit -m date "+%d.%m.%Y"
git checkout master
git merge FETCH_HEAD
这回答了你的问题吗?为了可靠性起见,我将添加
.PHONY:update
,以便名为update
的现有文件不会跳过更新。我还要添加set-e
在if
之前,让shell在第一个不成功的命令时退出,而不是继续进行随机更改。我不建议使用set-e
,但如果任何命令失败,我会更新答案以缩短命令链。