-R ve -R arasındaki fark


32

Genellikle bir işlemi tekrarlı olarak uygulamak istiyorum olur. Grep gibi bazı komutlar özyinelemeyi belirtmek için küçük harf r kullanır. Örneğin

grep -r foo .

Diğer komutlar büyük harf R'yi tercih ediyor gibi görünüyor:

chmod -R 755 .

Bunları sürekli yanlış yoldan alıyorum ve hangisinin hangisi olduğunu unutuyorum. Bu argümanlar için dava seçiminin arkasında bir mantık var mı?


1
"Çünkü kodlayıcılar mantıklı olduğunu düşünüyorlardı." (bunun iyi bir sebep olduğunu söylemiyorum, ama muhtemelen gerçek)
HalosGhost

1
Neye mal --recursiveolursa olsun, pek çok komut anlamış gibi görünmese de, yanlış bir şey yapmaları pek olası değildir.
Tanner Swett

4
chmod durumunda -r, okuma seviyesini her seviye için ayarlamak anlamına gelir
HorusKol 10:14

Yanıtlar:


37

Özyinelemeli dizin geçişi seçeneği çoğu POSIX komutlar ( ls, chmod, chgrp, chmod, cp, rm) sahip -Rolduğu için.

rmAyrıca, -rbaşlangıçta, POSIX'den çok önce olduğu gibi.

Şimdi, davranış ağaca doğru yürürken sembolik bağlantılar bulunduğunda değişmektedir. POSIX , kullanıcıya belirtilmemişse, varsayılanı bırakarak semboliklerle ne yapılacağına karar verme şansı vermek için -L/ -H/ Pseçeneklerini ekleyerek işleri tutarlı hale getirmeye çalıştı .

POSIX'de grephiç -rveya yok -R.

GNU grepbaşlangıçta ikisine de sahip değildi. -r1998 yılında eklendi. Bu, sembolik izleri takip ediyordu.

-R2001 yılında diğer kamu hizmetleri ile tutarlılık için eşanlamlı olarak eklenmiştir. Bu hala semboliklere uyuyordu.

2012 (grep 2.12) olarak, -rartık bunun muhtemel nedeni, sembolik takip ettin değiştirildi -L, -Hzaten başka bir şey için kullanıldı.

BSD'ler grepuzun süre GNU grep'e dayanıyordu. Bazıları kendi yazılarını yeniden yazdı ve GNU ile az ya da çok uyum sağladı grep. Apple OS / X, sembolik bağlantı sorununu farklı şekilde ele aldı. -rve -Raynı ve sembolik takip etmeyin. -SAncak chmod/ cp/ find'nin -Lsembolik izlerini takip etme gibi davranan bir seçenek var .


13
TL; DR : Tarihçe.
Sammitch

10
Erken tarih: rmdiğerlerinden önce özyinelemeli bir seçenek vardı. Öyleydi -r. Sonra cpbir eşleşme kazandı -r. Sonra lsözyinelemeli bir seçenek istedim, ama ls -rzaten "ters sıralama" anlamına gelmesi gerekiyordu -R. Orada gerginlik arasında -Rve -rbaşladı. -RHer ilgili yardımcı programa tutarlı bir şekilde eklenebilecek tek kişi rm -roydu , ancak zaten bilinen geleneksel kullanımdı. Sonra GNU geldi ve “tutarlılık ve gelenek kareler içindir dostum!” Dedi.

8

Hiçbir şekilde. Bu sadece geliştiricilerin ne seçtiğine bağlıdır. Çünkü her ikisi de geçerlidir -rve -Rgeçerli seçeneklerdir. Alıntı yaptığınız programlarda, örneğin:

  • GNU’nun son sürümleri grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
    
    -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.
    
  • chmodbaşka -rseçeneği yok , muhtemelen devs tercih ediyor -R. Ancak, tabii ki, -r(geçerli bir izinler dizedir işaret gerçekten orada kullanılamaz böylece @Arkadiusz Drabczykso yoluyla).


Senin nedir grepversiyonu? GNU grep 2.12 -rve -Raynı. Chmod ile -RPOSIX tarafından tanımlanır.
cuonglm

@Gnouc grep (GNU grep) 2.15ve ben bunu önceki sürümlerde gördüğümü hatırlıyoruz. Sende böyle olmadığından emin misin? Çoğu durumda temelde aynı sonuçları sağlarlar, sadece bağlantılar ile farklı davranırlar. Gelince chmod, iyi POSIX tarafından tanımlanabilir ancak orijinal çünkü, muhtemelen, hala chmodDevs seçti Rüzerinde r.
terdon

2
@Gucuc D'oh! Açıkçası, bu -rzaten geçerli bir izin dizesi olduğu için kullanamadılar .
terdon

3

Çoğunlukla, geliştirici kişisel bir tercih geliyor. Bununla birlikte, bazen, geliştiricilerin örneğin yinelemeli olarak çalışmaktan daha önemli olduğuna inandığı başka bir şey için tercih edilen küçük harfli bir seçenek kullanılırsa büyük harf seçeneği belirlenir. Chmod durumunda -rgeçerli bir moddur. Örneğin:

$ ll FILE
-rw-r--r-- 1 ja ja 0 Sep  9 16:42 FILE
$ chmod -r FILE
$ ll FILE
--w------- 1 ja ja 0 Sep  9 16:42 FILE

1

Bunları sürekli yanlış yoldan alıyorum ve hangisinin hangisi olduğunu unutuyorum.

Mümkünse, bu yardımcı programların GNU sürümlerini kullanın ve ardından seçenekler için daha uzun adları kullanabilirsiniz.

command --recursive

Bu argümanlar için dava seçiminin arkasında bir mantık var mı?

Yok hayır.

Ya da fazla değil. Unix programları parça parça geliştirildi ve komut seçenekleri liderlerinin ya da tek geliştiricilerinin kişisel seçeneklerini yansıtıyor. Sadece 26 ASCII küçük harf seçeneği vardır, bunlar tercih edilen settir (komutlar genellikle yazım kolaylığı için küçük harflerdir) ve bu sınırlı set anımsatıcı çatışmalara yol açar. Yeni komut / yardımcı program sürümlerinde yeni özellikler kazanıldığında, çatışmalar tutarsızlığa neden olur .


-1

20 yıl önce UNIX'i öğrendiğimde akıl hocam bana şöyle söyledi: “Her zaman özyinelemeli seçeneği her zaman büyük harfle R yazmanız gerekir. Her yerde. Size R yazarken tuşuna basarak rahatsız edici [rm * -Rf] konusunda dikkatli olmak için iyi bir alışkanlık verecektir. "


2
Standart olmayan seçenekler araçların uygulamaları arasında farklı olabileceğinden, kullandığınız belirli sistemdeki komut için el kitabını okumanızı söyleseydi daha iyi olurdu.
Kusalananda
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.