Mengapa menggunakan install daripada cp dan mkdir?

68

Saya telah melihat di banyak tempat yang digunakan install -duntuk membuat direktori dan install -cmenyalin file. Mengapa tidak menggunakan mkdirdan cp? Apakah ada keuntungan menggunakan install?

Neaţu Ovidiu Gabriel
sumber

Jawaban:

59

Itu tergantung pada apa yang Anda lakukan.

The installPerintah biasanya digunakan dalam skrip instalasi yang datang dengan paket dan kode sumber untuk menginstal binary untuk sistem Anda. Itu juga dapat digunakan untuk menginstal file atau direktori lain. Selain opsi -ddan yang -cAnda miliki -muntuk menentukan izin baru file yang akan diinstal, jadi Anda tidak perlu melakukan cpdan chmoduntuk mendapatkan hasil yang sama. Misalnya:

install -m644 "$srcdir/$pkgname-$pkgver-linux64" "$pkgdir/opt/$pkgname"

Anda juga memiliki opsi -gdan -ountuk mengatur grup target dan pemilik, masing-masing. Ini untuk menghindari panggilan terpisah chown. Secara umum, menggunakan installmemperpendek skrip Anda dan membuatnya lebih ringkas dengan melakukan pembuatan file, menyalin, pengaturan mode, dan hal-hal terkait dalam satu perintah, bukan banyak.

Untuk referensi, lihat man install. Untuk penggunaan, lihat saja skrip instalasi yang dikirimkan dengan beberapa kode sumber paket .


sumber
22

"instal" umumnya menggabungkan tindakan berikut:

  • Menyalin file yang ditentukan ke tempat target, yang sedang dilakukan sehubungan dengan proses yang menggunakan salinan lama. Tidak seperti "cp", "instal" baik batalkan tautan file sebelum pembuatan yang baru, atau (dalam sistem BSD, dengan -S switch) membuat yang baru dan mengganti nama menjadi nama target secara atom, yang menghindari kondisi perlombaan antara menginstal dan membuka kembali . Jika tidak menggunakan ini, penyalinan bisa gagal (dengan ETXTBSY) untuk file biner yang sedang berjalan, atau menyebabkan kerusakan jika file pustaka atau data diganti.
  • Setel kredensial yang tepat ke file baru tanpa perlu perintah terpisah.
  • Buat direktori perantara, jika diminta.
  • Hindari memodifikasi file target jika identik dengan versi baru (-C switch).

Jadi, itu mengikuti pendekatan Unix bahwa alat harus dibuat untuk tindakan tunggal tetapi lengkap menginstal file yang dibuat oleh beberapa alat bangunan ke lokasi kerjanya.

Konsep lengkap seperti yang saya jelaskan diimplementasikan dalam sistem BSD (dalam versi yang disebut "xinstall"); Saya memperlakukan mode "salinan aman" di sini (versi baru dengan penggantian nama atom) sebagai hal yang vital untuk ini. Sistem Linux (dari coreutils) ketinggalan bagian penting ini dan rentan terhadap perlombaan antara menghapus dan membuka kembali oleh proses pengamat; tapi ini bisa dicakup oleh manajer paket.

Netch
sumber
2
Penggunaan installatau $(INSTALL)dalam file makefile juga menandai langkah-langkah tersebut sebagai langkah penyalinan instalasi dan bukan langkah penyalinan biasa. Itu bisa bermanfaat.
Kaz
Saya menghadapi perlombaan di coreutils install ... apakah ada perbaikan, atau alternatif yang melakukan ini dengan benar?
trent
@trentw ras macam apa?
Netch
8

Terlepas dari deskripsi sebelumnya di sini tentang penggunaan, ada perbedaan tingkat rendah antara cpdan install, setidaknya di Linux. Jika menyalin di atas file yang ada, cptimpa inode file yang ada, sambil installselalu membuat inode baru untuk nama file yang sama.

Ini membuat perbedaan ketika menginstal versi baru dari biner yang berjalan. Penggunaan cpmenyebabkan kesalahan EBUSY, sementara installakan berhasil. Biner yang berjalan masih akan menggunakan versi lama, tetapi versi baru digunakan jika program di-restart.

Tomas Skäre
sumber
Itu menarik ... Jadi bisa membuat file dengan nama yang sama tetapi inode berbeda?
Neaţu Ovidiu Gabriel
1
@ NeaţuOvidiuGabriel Ya. Untuk pengguna, hanya akan ada satu file, karena file biasanya dicari berdasarkan nama. Tetapi untuk sistem file, ada dua file selama beberapa proses memegang referensi ke file lama. Hal yang sama dapat dicapai jika Anda mengganti nama atau menghapus file yang dibuka oleh suatu proses, dan kemudian membuat file baru dengan nama file yang sama.
Tomas Skäre
4

Jika direktori yang dimaksud sudah ada:

  • mkdir -p akan mencoba untuk mengatur bit mode kepemilikan dan file
  • install -d tidak akan mencoba mengatur bit mode kepemilikan dan file

Ini untuk mkdirdan installdari GNU coreutils . Keduanya menggunakan make_dir_parentsfungsi yang sama , tetapi dengan preserve_existingparameter yang diatur ke falseatau true, masing-masing.

Alexander
sumber
1
Diferensiasi yang berguna!
Victor