Różnica między -r a -R

32

Często zdarza się, że chcę zastosować operację rekurencyjnie. Niektóre polecenia, takie jak grep, używają małej litery r, aby wskazać rekurencję. Na przykład

grep -r foo .

Wydaje się, że inne polecenia wolą wielką literę R:

chmod -R 755 .

Ciągle źle je rozumiem i zapominam, która jest która. Czy istnieje logika wyboru wielkości liter dla tych argumentów?

cjol
źródło
1
„Ponieważ koderzy myśleli, że to rozsądne”. (nie mówię, że to dobry powód, ale to chyba prawda)
HalosGhost
1
Co jest warte, choć niewiele poleceń wydaje się rozumieć --recursive, prawdopodobnie nie zrobią nic złego.
Tanner Swett
4
w przypadku chmod jest to spowodowane -r
rozbiciem

Odpowiedzi:

37

Większość poleceń POSIX, które mają możliwość przejścia rekurencyjną katalog ( ls, chmod, chgrp, chmod, cp, rm) mają -Rza to.

rmrównież -rdlatego, że tak było początkowo na długo przed POSIX.

Teraz zachowanie zmienia się, gdy podczas przechodzenia po drzewie znajdują się dowiązania symboliczne. POSIX starał się zachować spójność, dodając opcje -L/ -H/, Paby dać użytkownikowi szansę decydowania o tym, co zrobić z dowiązaniami symbolicznymi, pozostawiając domyślną, gdy żadne nie zostanie podane nieokreślone.

POSIX grepnie ma -rlub -R.

GNU greppoczątkowo nie miał żadnego. -rzostał dodany w 1998 roku. To było po dowiązaniach symbolicznych.

-Rzostał dodany jako synonim w 2001 roku dla spójności z innymi narzędziami. To wciąż śledziło dowiązania symboliczne.

W 2012 r. (Grep 2.12) -rzostał zmieniony, aby przestał podążać za dowiązaniami symbolicznymi, być może dlatego -L, że -Hbyły już używane do czegoś innego.

BSD grepbyły oparte na GNU grep przez długi czas. Niektóre z nich przepisały własne i zachowały mniej więcej zgodność z GNU grep. Apple OS / X inaczej rozwiązał problem dowiązania symbolicznego. -ri -Rsą takie same i nie podążaj za dowiązaniami symbolicznymi. Istnieje -Sopcja jednak, że zachowuje się jak chmod/ cp/ find„s -Lopcją śledzenia dowiązania.

Stéphane Chazelas
źródło
13
TL; DR : Historia.
Sammitch,
10
Wczesna historia: rmmiał opcję rekurencyjną przed innymi. Tak było -r. Następnie cpzdobył dopasowanie -r. Potem lschciał mieć opcję rekurencyjną, ale ls -rjuż miał na myśli „sortowanie odwrotne”, więc tak musiało być -R. Istnieje napięcie między -Ri -rsię zaczęło. -Rbył jedynym, który można było konsekwentnie dodawać do każdego odpowiedniego narzędzia, ale rm -rbył już dobrze znanym tradycyjnym zastosowaniem. Potem pojawił się GNU i powiedział: „konsekwencja i tradycja dotyczą kwadratów, człowieku!”
8

Absolutnie nic. Zależy to po prostu od tego, co wybrali programiści. Jest to często, ponieważ oba -ri -Rsą poprawne opcje. W programach, które zacytowałeś, na przykład:

  • najnowsze wersje GNU 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.
    
  • chmodnie ma -ropcji, więc prawdopodobnie twórcy wolą -R. Oczywiście -rjest to jednak prawidłowy ciąg uprawnień (jak wskazał @Arkadiusz Drabczykso), więc nie można go tak naprawdę użyć.

terdon
źródło
Jaka jest twoja grepwersja GNU grep 2.12 -ri -Rsą takie same. Z chmod -Rjest zdefiniowany przez POSIX.
cuonglm
@Gnouc grep (GNU grep) 2.15i pamiętam, że widziałem to w poprzednich wersjach. Jesteś pewien, że tak nie jest w twoim przypadku? Zapewniają zasadniczo takie same wyniki w większości przypadków, zachowują się inaczej tylko z linkami. Jeśli chodzi o chmod, to może również zostać zdefiniowana przez POSIX ale to nadal, prawdopodobnie, ponieważ oryginalne chmoddeweloperów wybrał Rponad r.
terdon
2
@Gnouc D'oh! Oczywiście nie mogli użyć, -rponieważ jest to już prawidłowy ciąg uprawnień.
terdon
3

W większości sprowadza się to do osobistych preferencji programisty. Czasami jednak wybierana jest wielka litera, jeśli preferowana jest mała litera dla czegoś innego, co zdaniem deweloperów jest ważniejsze niż, na przykład, działanie rekurencyjne. W przypadku chmod -rjest to poprawny tryb. Na przykład:

$ 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
Arkadiusz Drabczyk
źródło
1

Ciągle źle je rozumiem i zapominam, która jest która.

Tam, gdzie to możliwe, użyj wersji GNU tych narzędzi, a następnie możesz użyć dłuższych nazw dla opcji.

command --recursive

Czy istnieje logika wyboru wielkości liter dla tych argumentów?

Nie.

Lub niewiele. Narzędzia uniksowe zostały opracowane fragmentarycznie, a opcje poleceń odzwierciedlają indywidualne wybory ich głównych lub wyłącznych twórców. Dostępnych jest tylko 26 małych liter opcji ASCII, co jest preferowanym zestawem (polecenia są na ogół pisane małymi literami, aby ułatwić pisanie), a ten ograniczony zestaw prowadzi do konfliktów mnemonicznych. Konflikty prowadzą do niespójności, ponieważ nowe wersje poleceń / narzędzi zyskały nowe funkcje .

RedGrittyBrick
źródło
-1

20 lat temu, kiedy nauczyłem się systemu UNIX, mój mentor powiedział mi w ten sposób: „Lepiej zawsze wpisuj opcję rekurencyjną wielkimi literami R. Zawsze ponieważ niektóre polecenia mają inne znaczenie dla opcji r małych, ale wielkie litery R działają głównie jako opcja rekurencyjna wszędzie. I da ci dobry nawyk, aby zachować ostrożność na [rm * -Rf], denerwując naciśnięcie klawisza Shift podczas pisania R. ”

enzoy
źródło
2
Byłoby lepiej, gdyby kazał ci przeczytać instrukcję dotyczącą poleceń w systemie, w którym pracujesz, ponieważ niestandardowe opcje mogą się różnić w zależności od implementacji narzędzi.
Kusalananda