Yap, jalankan saja patchdengan --dry-runopsi, itu akan gagal atau berhasil yang dapat ditemukan dengan status keluarnya.
Tetapi dengan cara yang lebih umum (dan rawan kesalahan) , Anda mungkin harus menjalankannya dengan -Ropsi yang berarti "membalikkan" karena hanya jika ia dapat mengembalikan seluruh tambalan itu dapat dianggap sebagai "diterapkan". Kalau tidak (tanpa '-R') itu bisa gagal hanya karena beberapa bagian dari file asli diubah. Di bawah ini adalah contoh sederhana:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Terlebih lagi, dalam cuplikan di atas Anda bahkan mungkin lebih memilih untuk diam patchsepenuhnya mengarahkan stdout dan stderr ke /dev/null)
Ini tidak bekerja untuk saya. Ketika saya menjalankan perintah itu, jika tambalan belum diterapkan, ia bertanya apakah akan 'membatalkan' tambalan dalam mode interaktif dan, jika saya menggunakan mode batch, itu akan mengabaikan operasi balik dan menerapkan tambalan, mengembalikan 0.
synack
1
Hei, coba tambahkan -sfke patch(dapat ditulis sebagai patch -Rsfp0 --dry-run)
poige
1
@synack apakah itu berjalan ok?
poige
16
Kalau-kalau itu membantu seseorang, jika Anda menggunakan skrip bash maka contoh yang diberikan oleh Mahakuasa tidak akan berfungsi. Dalam bash status keluar dari perintah yang berhasil adalah 0
Jadi yang berikut ini akan berhasil:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
Tidak, 0 benar. Patch akan keluar dengan non-nol jika dry-run gagal karena suatu alasan, dalam hal ini patch tidak boleh diterapkan.
Fls'Zen
Skrip saya benar di bash. bash menganggap kode keluar 0 trueuntuk keperluan if. Justru karena sebagian besar perintah menggunakan kode keluar 0 untuk menunjukkan keberhasilan.
Mahakuasa
2
Berikut ini dugaan, dengan asumsi bahwa Anda menggunakan patchutilitas dan setiap file yang akan ditambal memiliki tambalannya sendiri:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
Atau, jika Anda menambal file sebelumnya dan ingin tahu, apakah itu menyentuh beberapa file tertentu, Anda dapat menjalankan putaran tambalan pertama dengan -Bopsi, yang akan menyebabkan cadangan dibuat. Kemudian Anda memeriksa keberadaan cadangan.
peterph
8
Bisakah Anda mengembangkan sedikit tentang mengapa Anda memilih untuk menggunakan nohupdalam ifkasus itu?
zrajm
@zrajm - Saya tidak ingat mengapa saya melakukan itu. Dan pada saat saya perhatikan (karena permintaan persetujuan edit) bahwa itu ada di sana, sudah lama sekali tidak ada kesempatan saya akan pernah memulihkan alasannya. Sepertinya tidak ada gunanya bagi saya untuk melihatnya sekarang.
Mahakuasa
0
Dalam kasus saya, saya ingin melakukan pengecekan sehingga menjalankan perintah patch tidak akan berakhir dengan terminal interaktif yang menanyakan apa yang harus dilakukan (terutama untuk CI).
Ternyata jika Anda hanya membutuhkannya, Anda juga dapat menggunakan --forwardargumen dan itu akan melewati tambalan jika sudah diterapkan!
Jawaban:
Yap, jalankan saja
patch
dengan--dry-run
opsi, itu akan gagal atau berhasil yang dapat ditemukan dengan status keluarnya.Tetapi dengan cara yang lebih umum (dan rawan kesalahan) , Anda mungkin harus menjalankannya dengan
-R
opsi yang berarti "membalikkan" karena hanya jika ia dapat mengembalikan seluruh tambalan itu dapat dianggap sebagai "diterapkan". Kalau tidak (tanpa '-R') itu bisa gagal hanya karena beberapa bagian dari file asli diubah. Di bawah ini adalah contoh sederhana:(Terlebih lagi, dalam cuplikan di atas Anda bahkan mungkin lebih memilih untuk diam
patch
sepenuhnya mengarahkan stdout dan stderr ke/dev/null
)sumber
-sf
kepatch
(dapat ditulis sebagaipatch -Rsfp0 --dry-run
)Kalau-kalau itu membantu seseorang, jika Anda menggunakan skrip bash maka contoh yang diberikan oleh Mahakuasa tidak akan berfungsi. Dalam bash status keluar dari perintah yang berhasil adalah 0
Jadi yang berikut ini akan berhasil:
sumber
1
bukannya0
:if [ $? -eq 1 ]
true
untuk keperluan if. Justru karena sebagian besar perintah menggunakan kode keluar 0 untuk menunjukkan keberhasilan.Berikut ini dugaan, dengan asumsi bahwa Anda menggunakan
patch
utilitas dan setiap file yang akan ditambal memiliki tambalannya sendiri:sumber
-B
opsi, yang akan menyebabkan cadangan dibuat. Kemudian Anda memeriksa keberadaan cadangan.nohup
dalamif
kasus itu?Dalam kasus saya, saya ingin melakukan pengecekan sehingga menjalankan perintah patch tidak akan berakhir dengan terminal interaktif yang menanyakan apa yang harus dilakukan (terutama untuk CI).
Ternyata jika Anda hanya membutuhkannya, Anda juga dapat menggunakan
--forward
argumen dan itu akan melewati tambalan jika sudah diterapkan!sumber
Ini berhasil bagi saya.
sumber