Mkdir neden iç içe dizinin oluşturulmasına izin vermek için varsayılan olarak -p bayrağını ayarlamıyor?


11

-pBayrağın mkdirvarsayılan olarak ayarlanmaması için hiçbir neden göremiyorum .

  -p, --parents     no error if existing, make parent directories as needed

Görebildiğim kadarıyla yıkıcı olmayan bir komut. Bunun işleyişi hakkında önemli bir şeyi kaçırdım mı?

İkincisi, bunun varsayılan davranışı olmasını sağlamanın kolay bir yolu var mkdirmı?


2
.bashrc içinde koymak: alias mkdir="mkdir -p".
Kevin

Tüm tartışmalardan sonramkdp
Treffynnon

Yanıtlar:


6

Bu, her zaman istenmeyen isteğe bağlı bir özelliktir - özellikle komut dosyalarında. Komut dosyalarında aşağıdaki dezavantajları göz önünde bulundurun:

  • Dizinin zaten var olduğu bildirilmez: Bir komut dosyasının yeni oluşturulmuş bir dizine bazı dosyalar koyması gerekiyorsa ve bu dizin zaten var ve dosyalar içeriyorsa, komut dosyası çok karışıklık yaratabilir. (Daha sonra komut dosyası tarafından buraya yerleştirilen dosyaları filtrelemek zor olacaktır.)
  • Yukarıdakilerin kapak tarafında, bazı komut dosyaları (veya bunların bir kısmı) daha önce oluşturulan bir dizin yapısına bağlı olabilir (muhtemelen başka bir paket / komut dosyası tarafından). Örneğin, bir paket yükleme komut dosyasının kitaplıkları bir alt dizine koyması gerekebilir /usr/local/lib/GreatSoftware/ImportantPartOfIt, ancak kitaplıklar altındaki öğelere / bağlantısına bağlıdır /usr/local/lib/GreatSoftware. Bu eksikse, komut dosyası devam etmemelidir.

Bu mkdirtür durumlar bildirildiği ve hemen yakalanabildiği için genel davranışı kolay ve doğal hale getirir.


Her zaman mkdir -pmermilerinizde kullanmak istiyorsanız bunun için bir takma ad yapabilirsiniz :

alias mkdir='mkdir -p'

(Bu .bashrc, kabuğunuzun kullandığı veya yapılandırdığı herhangi bir yapılandırmaya gitmelidir .)


1
Standart olmayan bir şekilde davranmasını sağlamak için standart bir komut takma adı önermem. Bu, komut dosyalarını taşınabilir yapmaz ve okuyucuları karıştırabilir. Yeni bir takma ad veya işlev oluşturmak, alias mkdp="mkdir -p"daha tavsiye edilir.
jlliagre

2
@jlliagre Hayır, komut dosyalarını etkilemez. Yerel olarak tanımlanan takma adlar .bashrc(normalde) ortamlarını etkilemez.
rozcietrzewiacz

Gerçekten ama sen benim fikrimi kaçırdın. Kendi kullanımınız için bile davranışını değiştirmek için standart bir komutun takma adı önerilen bir uygulama değildir. En kötü örnek her yerde bulunur alias rm='rm -i'.
jlliagre

1
@jlliagre Kim tarafından önerilmez? ;) Ama evet, katılıyorum, kendimi farklı bir takma ad kullanmayı tercih ederim - ama ideolojik nedenlerden ötürü pratik değil. Ayrıca rm -itakma adın her zaman kötü olduğunu düşünmüyorum - ancak kötü alışkanlıklara yol açabilir. Kuşkusuz tüm komut takma adları eşit derecede iyi / kötü değildir - ls="ls --color=auto"ya da ssh="TERM=xterm ssh"örneğin.
rozcietrzewiacz

Benim tavsiyemde ideolojik bir şey yok. RM takma adı dolaylı olarak birçok kayıp dosyadan sorumludur (bu takma adın kurbanları ile tanıştım). Mkdir'in daha az ölçüde istenmeyen yan etkilere sahip olduğundan şüpheleniyordum. Tabii ki, ssh ve ls örnekleriniz gibi değişikliklere değil, davranışsal kozmetiklere karşı değilim.
jlliagre

16

Tabii ki, üst dizin oluşturmanın varsayılan olması gerektiği iddia edilebilir ve üst öğe yoksa dizin oluşturmayı önlemek için bazı kontrol seçenekleri kullanılabilir.

Ama bunun tam tersi olmasının nedeni sadece tarih. Mkdir'in temel sürümü üst dizinler yaratmadı. Bu nedenle X11 dağıtımları, bu görevi yerine getirebilen mkdirhier adlı bir komutla birlikte gelir : üst dizinlerin var olup olmadığını kontrol edin ve gerekirse oluşturun.

Daha sonra bu işlevsellik, birçok UNIX sürümünde mkdir komutuna eklendi (günümüzde POSIX standardında olup olmadığını bilmiyorum). Bu özellik bir seçenek bayrağı açarak sunulmuştur uyumluluk korumak için: -p.

Varsayılan olarak açmak neden kötü? Üst dizin yoksa, komut dosyaları mkdir'de başarısız olabilir. Özellikle kullanıcı kökü olarak varsayılan olarak dizin ağaçları oluşturmak tehlikeli olabilir.

Misal:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

Bu örnekte dizin oluşturulacak ve yapılan yedekleme bile dosya sistemi bağlanmamışsa ve varsayılan değer başka bir /backupyolsa üst öğe /backup/$(uname -n)yok.

Temel kural: Herhangi bir aracın varsayılan davranışını değiştirmemek iyi bir uygulamadır. İstenirse, varsayılan davranışın değiştirilmesine izin veren seçenekler sağlayın.


2
Burada kullandığın montaj örneğini seviyorum. O senaryoyu hiç düşünmemiştim.
Treffynnon

1
-P (ve -m) seçenekleri 1983'te System V tarafından tanıtıldı. Her ikisi de kesinlikle POSIX standardının bir parçasıdır.
jlliagre

4

Bence bu biraz felsefe. Çıplak mkdir (1) komutu (seçenekler olmadan) mkdir (2) sistem çağrısını temsil eder, kabuğunda işlevselliğini sağlar, az ya da çok bir şey yapmaz.


4

In başında , sadece çıplak vardı mkdirkomut. Unix'in tasarım ilkelerine uygun olarak, bu basit komut basit bir görevi yerine getirmiştir: bir dizin oluşturmak.

Daha sonra, arayanın belirli bir yolun var olduğundan emin olmak için sıfır, bir veya daha fazla dizin oluşturmak istediği ortak bir kullanım durumunu ele alma seçeneği mkdirelde etti -p. Bu, çeşitli nedenlerle varsayılan işlem yapılmadı. İlk olarak, tüm sistemler bu daha karmaşık bir özelliğe sahip değildi ve bu -pseçeneği gerektiren, kullanılan komut dosyalarının mkdir: invalid option -zgarip bir şekilde dizinler oluşturamama yerine makul bir hata mesajı (benzeri bir şey ) alacağı anlamına geliyordu . İkincisi ve en önemlisi, davranışı her durumda mkdir -puyumlu bir değişim değildir mkdir.

Özellikle, en fileystems üzerinde, mkdirbir bir atomik işlem . Bir program çalışır mkdir playgroundve komut başarılı olursa, program playgrounddizini oluşturduğunu bilir . Bu, programın yeni dizine özel oyun alanı olarak davranmasına izin verir: aynı programın başka bir örneği aynı anda çalışıyorsa, çağrısı mkdir playgroundbaşarısız olur. Bu özellik, mkdir -pargümanın var olmasına izin verdiği için açık değildir .

Eğer mkdir -pbaştan beri var olan, bu gibi bir şeyle, varsayılan mod yapılmış olabilir mkdir -atek dizin oluşturma komutu için. Ancak bu, her zamanki Unix tasarım felsefesini takip etmeyecekti: çoğu temel yardımcı program, temel ilkelerin etrafındaki basit süsleyicilerdir, süslü seçenekler gerektiren meraklı davranışı ile (tek seferde birden fazla dizin oluşturmak gibi).


2

Benim için sorun, varsayılan olsaydı -p seçeneğinin davranışı aslında bir yan etkidir. Yapmasını istediğiniz şeye ek bir şey yaparak bir komuta karmaşıklık katar. Hatırlanması gereken bir daha görünmez şey. Ses programlama uygulamasının temel kurallarından biri yan etkilerden kaçınmaktır.

Modern programlama dilleri o kadar güçlüdür ki, bir dilin sağladığı ilkellerden ihtiyacınız olabilecek her türlü karmaşık komutu oluşturmak nispeten kolaydır. Bunu yapmak, hangi davranışın gerekli olduğu hakkında bilinçli bir karar vermeyi içerir ve ayrıca yapılanların somut, görünür bir kaydını bırakır.

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.