Pertanyaan ini seperti "Saya punya satu alat yang bisa menggambar persegi panjang dan yang lain bisa menggambar belah ketupat; mana yang merupakan alat yang tepat untuk menggambar persegi?"
Setiap kotak adalah kasus khusus persegi panjang dan kasus khusus belah ketupat, sehingga salah satu dari dua alat dapat digunakan.
Hal yang sama dengan dd
dan cat
. Yang pertama dapat melakukan konversi, lewati dan cari, sesuaikan ukuran buffer; tetapi dalam kasus sederhana itu hanya membaca satu file (atau memblokir perangkat) dan menulis data mentah ke yang lain. Yang terakhir dapat menggabungkan beberapa file menjadi satu aliran dengan beberapa modifikasi tekstual opsional, tetapi dalam kasus sederhana hanya ada satu file input yang kontennya di-stream (dengan dukungan shell) ke file output atau perangkat.
Kedua alat ini bermanfaat dan tidak ada yang bisa diabaikan untuk yang lain. Lingkup mereka hanya tumpang tindih pada case sederhana ini yang Anda tanyakan.
Setelah mengatakan bahwa saya pikir setidaknya ada dua masalah yang membuat dd
pilihan yang lebih baik.
1. Blokir izin perangkat
Untuk menulis ke file atau perangkat cat
perlu outputnya dialihkan. Shell Anda melakukan pengalihan yaitu membuka file target. Saat mengalihkan ke /dev/sdb
Anda mungkin akan menekan "izin ditolak" kecuali Anda login sebagai root . Menjalankan shell karena root berisiko dan harus dihindari.
Anda boleh mencoba
sudo cat myimage.img > /dev/sdb
dan gagal karena sudo
tidak mempengaruhi pengalihan output yang dilakukan oleh shell.
Di sisi lain ini sama sekali tidak bermasalah:
sudo dd if=myimage.img of=/dev/sdb
Sedikit petunjuk: jika Anda menemukan diri Anda dalam situasi di mana Anda harus mengarahkan output ke file dengan akses terbatas maka Anda dapat menggunakan trik ini:
some_command | sudo tee restricted_file > /dev/null
Itu membawa kita ke cara lain untuk melakukan pekerjaan itu. Perintah tee
meneruskan inputnya ke beberapa file dan ke output standar. Dalam kasus sederhana ada satu file dan output standar dibuang:
sudo tee /dev/sdb < myimage.img > /dev/null
Dalam hal ini ada juga pengalihan input yang tidak terpengaruh oleh sudo
.
2. Melangkah melampaui kasus sederhana
Bayangkan seorang tukang kayu yang membuat meja dapur. Sebagian besar tabel memiliki permukaan atas persegi panjang; yang berbentuk belah ketupat jauh lebih jarang. Ada meja dengan bagian atas yang harus dibuat. Kotak adalah belah ketupat, juga persegi panjang. Apakah tukang kayu akan menggunakan metode yang berlaku untuk meja berbentuk belah ketupat yang langka? atau ke meja persegi panjang umum? Kedua set metode harus bekerja dengan tabel persegi, namun ia membuat persegi panjang setiap hari kerja, sehingga tidak ada gunanya mengubah pendekatan.
Kembali ke cat
dan dd
. Menurut pendapat saya (dan latihan saya) hampir tidak pernah ada kebutuhan untuk menggabungkan beberapa gambar untuk menulis semuanya untuk memblokir perangkat. Itu pasti akan menjadi pekerjaan cat
. Alat ini dapat melakukan sesuatu yang lebih tetapi Anda tidak menginginkannya: opsi menargetkan file teks sehingga mereka dapat membatalkan data biner Anda saat digunakan dengan file gambar.
Sekarang, opsi yang disediakan oleh dd
sering berguna bagi saya ketika saya membaca dari atau menulis ke perangkat:
conv=noerr
- ketika sumbernya mungkin salah;
bs=…
- buffer besar tidak akan menghabiskan HDD saya;
count=…
- untuk membaca sebuah fragmen, seperti MBR;
conv=sparse
- untuk mengurangi ukuran gambar dalam beberapa keadaan.
Masih ada lagi. Perintah ini:
kill -s USR1 $(pidof dd)
membuat dd
statistik I / O cetak ke kesalahan standar. Saya tidak berpikir Anda bisa melakukan ini cat
.
Ini adalah alasan yang saya anggap dd
sebagai alat alami untuk bekerja dengan gambar mentah. Saya melihat tidak ada gunanya mengubah alat cat
hanya karena tidak ada perbedaan dalam beberapa kasus khusus. Saya ingin memikirkan instruksi yang biasanya digunakan dd
karena penulisnya berpikir seperti saya. Ada beberapa keanggunan dalam kemampuan untuk secara sadar memilih alat yang tepat , terutama ketika ada lebih banyak yang tampaknya sama-sama cocok.
Pada akhirnya saya akui saya telah menggunakan pv myimage.img | sudo tee /dev/sdb > /dev/null
. Saya meninggalkan alat kanan saya tetapi pv
memberi saya progress bar. Kecuali jika Anda perlu menggabungkan (atau memecahkan data biner Anda dengan alat teks) cat
tidak memberikan apa-apa.