Apakah mungkin untuk mengetahui apakah suatu file telah ditambal, sebelum menerapkan tambalan?
Saya perlu melakukan ini dalam naskah, ada pemikiran?
Apakah mungkin untuk mengetahui apakah suatu file telah ditambal, sebelum menerapkan tambalan?
Saya perlu melakukan ini dalam naskah, ada pemikiran?
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:
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 patch
sepenuhnya mengarahkan stdout dan stderr ke /dev/null
)
-sf
ke patch
(dapat ditulis sebagai patch -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:
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
1
bukannya 0
: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:
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
-B
opsi, yang akan menyebabkan cadangan dibuat. Kemudian Anda memeriksa keberadaan cadangan.
nohup
dalam if
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!