Membandingkan berkas Linux dengan diff dan cmp: keluaran dan status
Gunakan diff untuk melihat baris teks mana yang berubah dan bagaimana perubahannya, serta cmp untuk memeriksa apakah dua berkas identik byte demi byte. Pada GNU Diffutils, status keluar 1 berarti ditemukan perbedaan, sedangkan 2 berarti ada masalah dalam perbandingan. Latihan ini memakai dua berkas kecil agar keluaran dan statusnya dapat dibandingkan.
Gunakan panduan membaca isi berkas untuk menyiapkan dan memeriksa masukan. Status diff 1 menunjukkan perbedaan, sehingga perlu dibedakan dari galat operasional saat memakai eksekusi bersyarat dalam shell yang dijelaskan dalam bahasa Inggris.
Menyiapkan dua berkas pembanding
Latihan memakai Bash dan GNU Diffutils sebagai pengguna biasa. Jika ~/linux-course-13-practice sudah ada, pilih nama baru dan sesuaikan jalur. Berhenti jika mkdir pertama atau cd gagal. Perintah > pada langkah berikut dapat menimpa berkas yang sudah ada, sehingga hanya boleh dijalankan setelah pwd menunjukkan direktori latihan baru dan kosong.
mkdir ~/linux-course-13-practice
cd ~/linux-course-13-practice
pwd
Setelah lokasinya benar, buat kedua berkas. Hanya baris kedua yang berbeda: beta pada old.txt dan BETA pada new.txt.
printf 'alpha\nbeta\ngamma\n' > old.txt
printf 'alpha\nBETA\ngamma\n' > new.txt
Membaca perubahan baris dengan diff
diff membandingkan baris. Opsi -u memilih format terpadu atau unified diff, yang menyertakan baris konteks yang tidak berubah di sekitar perubahan. Opsi GNU --label mengganti kepala keluaran yang biasanya berisi nama dan waktu berkas dengan label tetap. Nama label tidak mengubah isi atau nama berkas masukan.
diff -u --label old --label new old.txt new.txt
Untuk kedua berkas latihan, hasilnya adalah:
--- old
+++ new
@@ -1,3 +1,3 @@
alpha
-beta
+BETA
gamma
--- menandai masukan pertama, sedangkan +++ menandai masukan kedua. Kepala @@ menunjukkan rentang baris: -1,3 berarti mulai baris 1 sebanyak 3 baris pada masukan pertama, dan +1,3 rentang yang sama pada masukan kedua. Baris berawalan - berasal dari berkas pertama, + dari berkas kedua, dan spasi menandai konteks yang sama. Karena itu, contoh menunjukkan beta diganti menjadi BETA.
diff tidak mengetahui berkas mana yang Anda anggap versi asli; urutan argumen menentukan arah perbandingan. Perintah ini hanya melaporkan perbedaan, bukan menerapkan perubahan pada berkas. Jika keluarannya berbeda dari contoh, periksa isi kedua berkas dan pastikan urutan argumennya sama.
Menemukan perbedaan byte pertama dengan cmp
cmp membandingkan byte dan secara bawaan melaporkan lokasi perbedaan pertama. Pada contoh ini, perbedaan berada pada huruf pertama baris kedua, setelah alpha dan satu karakter baris baru.
cmp old.txt new.txt
GNU cmp dengan tampilan berbahasa Inggris dapat mencetak old.txt new.txt differ: byte 7, line 2. Penomoran byte dan baris dimulai dari 1. Lima byte alpha ditambah satu byte baris baru menempatkan b dan B pada byte ke-7. Penjelasan ini berlaku untuk data tepat yang dibuat dengan printf di atas; pengodean atau akhir baris lain dapat mengubah posisi byte.
Pesan dapat berbeda menurut nama berkas dan locale, yaitu pengaturan bahasa lingkungan. cmp tanpa opsi tidak merinci setiap perbedaan selanjutnya; GNU cmp -l tersedia jika membutuhkan daftar byte yang berbeda. Jika satu berkas merupakan awalan berkas lain, cmp dapat melaporkan akhir berkas pada masukan yang lebih pendek.
Untuk pemeriksaan tanpa pesan, gunakan -s lalu segera baca status keluar. Karena kedua berkas berbeda, contoh berikut mencetak 1. Variabel khusus $? memuat status perintah terakhir yang selesai, sehingga jangan menyisipkan perintah lain di antara kedua baris.
cmp -s old.txt new.txt
echo $?
Status yang terlihat setelah seluruh blok selesai dapat merupakan status echo, bukan cmp. Angka yang dicetak echo itulah status cmp yang baru saja dibaca. Saat menulis skrip, simpan atau uji status segera sebelum menjalankan pekerjaan lain.
Membedakan perbedaan dan galat
| Status keluar | Arti pada GNU diff dan cmp | Pemeriksaan berikutnya |
|---|---|---|
0 |
Tidak ditemukan perbedaan | Pastikan masukan dan kriteria yang dipakai memang benar |
1 |
Berkas berbeda | Baca keluaran diff untuk memahami perubahan teks |
2 |
Ada masalah, misalnya berkas tidak dapat dibaca | Periksa jalur, izin, dan pesan galat |
cmp cocok untuk pertanyaan identitas byte, sedangkan diff -u membantu memahami perubahan teks. Dengan opsi yang mengabaikan jenis perbedaan tertentu, hasil diff mengikuti kriteria opsi tersebut; jangan menyamakannya dengan pemeriksaan identitas byte. Akhir baris atau pengodean yang berbeda juga dapat menyebabkan perbedaan walau teks tampak serupa.
Untuk berkas biner, diff teks mungkin tidak memberi uraian yang berguna; mulailah dengan cmp jika pertanyaannya hanya apakah isi persis sama. GNU diff -r dapat membandingkan pohon direktori, tetapi cakupannya lebih luas. Periksa kedua jalur sebelum menjalankannya. Jika status 2 muncul, selesaikan masalah akses atau nama berkas sebelum menyimpulkan bahwa isinya berbeda.
Dokumentasi resmi
Manual resmi GNU Diffutils menjelaskan format terpadu, keluaran cmp, dan status keluar kedua perintah.




