跳过已应用的补丁时使“补丁”返回 0
Posted
技术标签:
【中文标题】跳过已应用的补丁时使“补丁”返回 0【英文标题】:Make `patch` return 0 when skipping an already applied patch 【发布时间】:2014-04-30 18:23:36 【问题描述】:我有一个运行补丁命令的构建工具,如果补丁命令返回非零,它将导致构建失败。我正在应用一个可能已经应用也可能尚未应用的补丁,所以我使用-N
选项到patch
,它应该跳过。但是,当它跳过时,patch
返回非零值。有没有办法强制它返回 0,即使它跳过应用补丁?我在手册页中找不到任何此类功能。
【问题讨论】:
【参考方案1】:我相信下面的食谱应该可以解决问题,这是我在相同情况下使用的方法;
patches: $(wildcard $(SOMEWHERE)/patches/*.patch)
for patch_file in $^; do \
patch --strip=2 --unified --backup --forward --directory=<somewhere> --input=$$patch_file; \
retCode=$$?; \
[[ $$retCode -gt 1 ]] && exit $$retCode; \
done; \
exit 0
这个配方循环依赖(在我的例子中是补丁文件)并为每个调用补丁。我所依赖的“技巧”是,如果补丁已经应用,则补丁返回 1,而其他错误(例如不存在的补丁文件)则返回其他更高的数字。补丁手册条目的 DIAGNOSTICS 部分描述了返回码情况。 YMMV
【讨论】:
这让我觉得patch
的 CLI 中存在令人头疼的缺陷。我遇到这个的原因是因为我有另一个工具,而不是运行补丁并使用它的返回码(0 与非零)来确定它是成功还是失败。感谢您的回答,我将使用此脚本而不是 patch
作为补丁命令。不过,奇怪的是他们没有为此提供开关。【参考方案2】:
已接受的答案对我不起作用,因为补丁在其他类型的错误(可能是不同的版本或某事)上也返回 1。 因此,如果出现错误,我会检查“跳过补丁”消息的输出以忽略此类但在其他问题上返回错误。
OUT="$(patch -p0 --forward < FILENAME)" || echo "$OUT" | grep "Skipping patch" -q || (echo "$OUT" && false);
【讨论】:
【参考方案3】:你也可以只用一行来做
patch -p0 --forward < patches/patch-babylonjs.diff || true
所以如果你想应用补丁并确保它正在工作:
(patch -p0 --forward < patches/patch-babylonjs.diff || true) && echo OK
无论补丁是否已经应用,这里总是显示“OK”。
【讨论】:
如果补丁尚未应用并且也无法应用,这仍会说OK
。
但是第一个例子效果很好。退出代码为 0,如果已应用补丁,则显示“检测到反向(或以前应用)的补丁!正在跳过补丁。”【参考方案4】:
下面是一个脚本,它从@fsw 迭代上述想法,并根据需要处理 .rej 文件的删除。
#! /bin/sh
set +x
set -euo pipefail
bn=$(basename "$0")
patch="$1"; shift
r=$(mktemp /tmp/"$bn".XXXX)
if ! out=$(patch -p1 -N -r "$r" < "$patch")
then
echo "$out" | grep -q "Reversed (or previously applied) patch detected! Skipping patch."
test -s "$r" # Make sure we have rejects.
else
test -f "$r" && ! test -s "$r" # Make sure we have no rejects.
fi
rm -f "$r"
【讨论】:
以上是关于跳过已应用的补丁时使“补丁”返回 0的主要内容,如果未能解决你的问题,请参考以下文章
如何将补丁应用于 Richfaces 4.0.0.Final
是连续应用 oracle OBIEE 捆绑补丁还是只应用最新的
Weblogic12.1.3.0补丁安装(win server与linux安装步骤介绍)
关于Oracle 10.2.0.5 版本应用SCN补丁14121009相关问题