我有一个运行补丁程序命令的构建工具,如果patch命令返回非零值,它将导致构建失败。我正在应用可能已经或可能尚未应用的补丁程序,因此我使用的-N选项patch,该选项会跳过。但是,当它跳过时,patch将返回非零值。有没有办法强迫它即使跳过应用补丁程序也要返回0?我在手册页中找不到任何此类功能。
接受的答案对我不起作用,因为补丁在其他类型的错误(可能是不同的版本或其他)上也返回 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