跳过已应用的补丁时使`patch`返回0

zjm*_*555 5 patch

我有一个运行补丁程序命令的构建工具,如果patch命令返回非零值,它将导致构建失败。我正在应用可能已经或可能尚未应用的补丁程序,因此我使用的-N选项patch,该选项会跳过。但是,当它跳过时,patch将返回非零值。有没有办法强迫它即使跳过应用补丁程序也要返回0?我在手册页中找不到任何此类功能。

fsw*_*fsw 6

接受的答案对我不起作用,因为补丁在其他类型的错误(可能是不同的版本或其他)上也返回 1 。因此,如果出现错误,我会检查输出中的“跳过补丁”消息以忽略此类错误,但在其他问题上返回错误。

OUT="$(patch -p0 --forward < FILENAME)" || echo "${OUT}" | grep "Skipping patch" -q || (echo "$OUT" && false);
Run Code Online (Sandbox Code Playgroud)


小智 4

我相信以下食谱应该可以解决问题,这就是我在相同情况下使用的方法;

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
Run Code Online (Sandbox Code Playgroud)

此配方循环遍历依赖项(在我的例子中是补丁文件)并为每个依赖项调用 patch。我所依赖的“技巧”是,如果补丁已被应用,则补丁返回 1,而其他错误(例如不存在的补丁文件)则返回更高的数字。补丁手册条目的诊断部分描述了返回代码情况。青年MMV

  • 在我看来,这是“patch”CLI 中一个令人头疼的缺陷。我遇到这个问题的原因是因为我有另一个工具,而不是运行 patch 并使用它的返回代码(0 与非零)来确定它是成功还是失败。感谢您的回答,我将使用此脚本而不是“patch”作为补丁命令。不过,奇怪的是他们没有为此设置开关。 (7认同)