Neden cp ve mkdir yerine install kullanın?


Yanıtlar:


58

Bu ne yaptığınıza bağlı.

installKomut normalde sisteminize bir ikili yüklemek için paketler ve kaynak kodu ile gelen yükleme komut kullanılır. Başka bir dosya veya dizini kurmak için de kullanılabilir. Kurulacak dosyanın yeni izinlerini belirlemek için sahip olduğunuz -dve -cseçeneklerine ek olarak , aynı sonucu elde etmek için -ma cpve a yapmanız gerekmez chmod. Örneğin:

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

Ayrıca seçenekler var -gve -osırasıyla hedef grup ve sahibi, ayarlanması için. Bu, yapılan ayrı çağrıları önler chown. Genel olarak, installkomut dosyanızı kısaltır ve dosya oluşturma, kopyalama, mod ayarı ve ilgili öğeleri birçok komut yerine tek bir komutla yaparak daha özlü hale getirir.

Referans için bkz man install. Kullanım için, sadece bazı paket kaynak kodlarıyla birlikte gelen kurulum komut dosyalarına bir göz atın .


22

"install" genellikle aşağıdaki işlemleri birleştirir:

  • Belirtilen dosyanın eski bir kopya kullanan işlemlerle ilgili olarak yapıldığı hedef yere kopyalanması. "Cp" den farklı olarak, "install" ya yenisi oluşturulmadan önce dosyadaki bağlantıyı kaldırır veya (BSD sistemlerinde -S anahtarlı) yeni bir tane oluşturur ve hedef adıyla atomik olarak yeniden adlandırma yapar; . Bunu kullanmazsanız, çalışan bir ikili dosya için kopyalama işlemi (ETXTBSY ile) başarısız olabilir veya bir kütüphane dosyası veya veri değiştirilirse çökmeye neden olabilir.
  • Ayrı komutlara gerek kalmadan yeni dosyaya uygun kimlik bilgilerini ayarlayın.
  • İstenirse ara dizinleri hazırlayın.
  • Yeni sürümle aynı ise (-C anahtarı) bir hedef dosyayı değiştirmekten kaçının.

Bu nedenle, Unix yaklaşımını izleyerek bir takımın, bir inşaat aracı tarafından yapılan bir dosyayı çalışma yerine yerleştirme işleminin tek bir işlemle yapılması için yapılması gerekir.

Açıkladığım gibi tam konsept BSD sistemlerinde ("xinstall" sürümünde) uygulanmaktadır; Burada "güvenli kopya" modunu (atomik yeniden adlandırmalı yeni sürüm) bunun için hayati olarak kabul ediyorum. Linux sistemleri (coreutils'den) bu önemli kısmı kaçırır ve bir takip eden sürecin silinmesi ve yeniden açılması arasındaki yarışlara açıktır; ancak bu paket yöneticileri tarafından ele alınabilirdi.


2
Makefiles içinde installveya $(INSTALL)içinde kullanımı, bu adımları, bazı normal kopyalama adımlarını değil, kurulum kopyalama adımları olarak da işaretler. Bu faydalı olabilir.
Kaz,

Coreutils kurulumunda yarışa rastlıyorum ... bir düzeltme veya bunu doğru yapan bir alternatif var mı?
trent

@trentw ne tür bir yarış?
Netch

8

Buradaki kullanımla ilgili önceki açıklamaların yanı sıra , en azından Linux arasında cpve arasında düşük düzeyde bir fark vardır install. Mevcut bir dosyanın cpüzerine kopyalanıyorsa , installher zaman aynı dosya adı için yeni bir inode oluştururken , dosyanın mevcut inode'unun üzerine yazar .

Bu, çalışan bir binary'in yeni bir versiyonunu yüklerken fark yaratır. Kullanmak cpbir EBUSY hatasına neden olurken installbaşarılı olur Çalışan ikili dosya eski sürümü kullanmaya devam eder, ancak program yeniden başlatıldığında yeni sürüm kullanılır.


Bu ilginç ... Yani aynı isimde fakat farklı inode ile bir dosya oluşturabilir mi?
Neaţu Ovidiu Gabriel

1
@ NeaţuOvidiuGabriel Evet. Kullanıcılar için, sadece bir dosya olacaktır, çünkü dosyalar genellikle ada göre aranır. Ancak, dosya sistemine göre, bazı işlemler eski dosyaya gönderme yaptığı sürece iki dosya vardır. Bir işlem tarafından açılan bir dosyayı yeniden adlandırır veya silerseniz ve aynı dosya adına sahip yeni bir dosya oluşturursanız, aynı işlem gerçekleştirilebilir.
Tomas Skäre

4

Söz konusu dizin zaten mevcutsa:

  • mkdir -p sahiplik ve dosya modu bitlerini ayarlamaya çalışacak
  • install -d sahiplik ve dosya modu bitlerini ayarlamaya çalışmaz

Bu içindir mkdirve installgelen GNU coreutils . Her ikisi de aynı make_dir_parentsişlevi kullanır, ancak preserve_existingparametre sırasıyla falseveya ile ayarlanır true.


1
Yararlı farklılaşma!
Victor,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.