นี้จะสัมผัสกับในสองคำถาม ' ตรวจสอบว่าไฟล์หรือโฟลเดอร์ได้รับการติดตั้งแล้ว ' และ ' ทำให้patch
ผลตอบแทน 0 เมื่อข้ามแพทช์ใช้แล้ว ' แต่ไม่ได้คำตอบที่น่าพอใจ
ฉันกำลังเขียนสคริปต์และต้องการทดสอบโปรแกรมปรับปรุงต่อไปนี้:
ใช้อย่างเต็มที่: ดำเนินการต่อ
นำไปใช้บางส่วน: ออก
ไม่ได้ใช้: ถ้ามันสามารถนำไปใช้ประสบความสำเร็จทำมันและดำเนินการต่อมิฉะนั้นออกจาก
ปัญหาคือการจัดการกรณีที่นำไปใช้บางส่วน:
mkdir test && cd test
cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF
patch --forward -i foobar.patch
rm foo
มีแถบอยู่ แต่ foo ไม่ได้เพราะในบางจุดมันถูกลบออก ตอนนี้ถ้าฉันใช้แพทช์ไปข้างหน้าในที่แห้งเรียกใช้รหัสทางออก 1 เพราะมันไม่ได้ใช้อย่างประสบความสำเร็จ
$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists! Skipping patch.
1 out of 1 hunk ignored
$ echo $?
1
ที่ไม่ได้บอกฉันว่าแพทช์ถูกนำไปใช้อย่างเต็มที่ แต่เพียงว่ามันล้มเหลวในการเรียกใช้แห้ง ฉันไม่ทราบสาเหตุที่ทำเครื่องหมายว่าถูกต้องเป็นคำตอบ stackoverflow ฉันพยายามย้อนกลับ แต่เนื่องจากเป็นสคริปต์ที่ไม่โต้ตอบจึงทำงานได้กับ:
$ patch --dry-run --reverse --force -i foobar.patch
The next patch, when reversed, would delete the file foo,
which does not exist! Applying it anyway.
checking file foo
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED
checking file bar
$ echo $?
1
มันจะถืออยู่เสมอว่าถ้าฉันพยายามบังคับให้โปรแกรมแก้ไขย้อนกลับในระยะแห้งและประสบความสำเร็จในการใช้งานโปรแกรมแก้ไขอย่างสมบูรณ์และหากไม่สำเร็จก็ไม่ได้ใช้อย่างเต็มที่ (หรือใช้เลย) เพราะถ้าเป็นเช่นนั้นฉันสามารถทำสิ่งที่ชอบ
patch --dry-run --reverse --force -i foobar.patch ||
(patch --dry-run --forward --force -i foobar.patch &&
patch --forward --force -i foobar.patch) ||
exit 1