Der Unterschied zwischen -r und -R


32

Es kommt oft vor, dass ich eine Operation rekursiv anwenden möchte. Einige Befehle, z. B. grep, verwenden ein kleines r, um eine Rekursion anzuzeigen. Beispielsweise

grep -r foo .

Andere Befehle scheinen ein R in Großbuchstaben zu bevorzugen:

chmod -R 755 .

Ich verstehe diese ständig falsch und vergesse, was was ist. Gibt es eine Logik für die Auswahl des Falls für diese Argumente?


1
"Weil die Programmierer es für sinnvoll hielten." (nicht zu sagen, dass dies ein guter Grund ist, aber es ist wahrscheinlich die Wahrheit)
HalosGhost

1
Für das, was es wert ist, obwohl nicht viele Befehle zu verstehen scheinen --recursive, werden sie wahrscheinlich nicht das Falsche tun.
Tanner Swett

4
Im Fall von chmod -rbedeutet dies, das
Lesebit

Antworten:


37

Die meisten POSIX - Befehle , die rekursive Directory - Traversal - Option ( ls, chmod, chgrp, chmod, cp, rm) haben -Rdafür.

rmhat auch -rweil es das war was es anfangs war, lange vor POSIX.

Das Verhalten ändert sich nun, wenn beim Durchlaufen des Baums Symlinks gefunden werden. POSIX versucht , die Dinge in Einklang , indem die machen -L/ -H/ POptionen dem Benutzer die Möglichkeit zu geben , zu entscheiden , was mit Symlinks verlassen den Standard zu tun , wenn keine unbestimmten vorgesehen ist.

POSIX grephat kein -roder -R.

GNU hatte grepanfangs keine. -rwurde 1998 hinzugefügt. Das war nach Symlinks.

-Rwurde 2001 als Synonym für die Übereinstimmung mit den anderen Versorgungsunternehmen hinzugefügt. Das folgten noch Symlinks.

Im Jahr 2012 (grep 2.12), -rgeändert wurde , so dass es nicht mehr Symlinks gefolgt, vielleicht weil -L, -Hschon für etwas anderes verwendet wurden.

BSDs grepbasierten lange Zeit auf GNU grep. Einige von ihnen haben ihre eigenen umgeschrieben und sind mehr oder weniger kompatibel mit GNU grep. Apple OS / X hat das Symlink-Problem anders gelöst. -rund -Rsind gleich und folgen keinen symlinks. Es gibt eine -SOption , aber die wie wirkt chmod/ cp/ find‚s - -LOption Symlinks zu folgen.


13
TL; DR : Geschichte.
Sammitch

10
Frühgeschichte: rmhatte eine rekursive Option vor den anderen. Es war -r. Dann cpein Matching gewonnen -r. Wollte lsdann eine rekursive Option haben, ls -rbedeutete aber schon "umgekehrte Sortierung", so musste es sein -R. Dort begann die Spannung zwischen -Rund -r. -Rwar die einzige, die konsequent zu jedem relevanten Dienstprogramm hinzugefügt werden konnte, war aber rm -rbereits die bekannte traditionelle Verwendung. Dann kam GNU und sagte: "Beständigkeit und Tradition sind für Quadrate, Mann!"

8

Überhaupt keine. Es kommt einfach darauf an, was die Entwickler gewählt haben. Es liegt oft an beidem -rund -Rsind gültige Optionen. In den von Ihnen zitierten Programmen zum Beispiel:

  • aktuelle Versionen von 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.
    
  • chmodes gibt keine -rmöglichkeit also ziehen die devs vermutlich vor -R. Es handelt sich jedoch natürlich -rum eine gültige Berechtigungszeichenfolge ( auf die @Arkadiusz Drabczykso hingewiesen hat), sodass sie dort nicht wirklich verwendet werden kann.


Was ist deine grepVersion? GNU grep 2.12 -rund -Rsind gleich. Mit chmod -Rwird durch POSIX definiert.
Cuonglm

@ Gnouc grep (GNU grep) 2.15und ich erinnern uns, dies in früheren Versionen gesehen zu haben. Sind Sie sicher, dass dies bei Ihnen nicht der Fall ist? Sie liefern in den meisten Fällen im Wesentlichen die gleichen Ergebnisse, sie verhalten sich nur bei Verknüpfungen unterschiedlich. Was chmodkann es gut von POSIX definiert werden , aber das ist immer noch, vermutlich, weil die ursprünglichen chmodEntwickler wählen Rüber r.
Terdon

2
@ Gnouc D'oh! Offensichtlich konnten sie nicht verwenden, -rda dies bereits eine gültige Berechtigungszeichenfolge ist.
Terdon

3

Meistens kommt es auf eine persönliche Präferenz des Entwicklers an. Manchmal wird jedoch eine Großbuchstabenoption gewählt, wenn eine bevorzugte Kleinbuchstabenoption für etwas anderes verwendet wird, das nach Ansicht der Entwickler wichtiger ist, als beispielsweise rekursiv zu arbeiten. Bei chmod -rhandelt es sich um einen gültigen Modus. Beispielsweise:

$ 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

Ich verstehe diese ständig falsch und vergesse, was was ist.

Verwenden Sie nach Möglichkeit die GNU-Versionen dieser Dienstprogramme, und verwenden Sie dann die längeren Namen für Optionen.

command --recursive

Gibt es eine Logik für die Auswahl des Falls für diese Argumente?

Nein.

Oder nicht viel. Die Unix-Dienstprogramme wurden stückweise entwickelt, und die Befehlsoptionen spiegeln die individuellen Entscheidungen ihrer Haupt- oder Alleinentwickler wider. Es stehen nur 26 ASCII-Kleinbuchstaben zur Verfügung. Dies ist der bevorzugte Satz (Befehle werden im Allgemeinen zur Vereinfachung der Eingabe in Kleinbuchstaben geschrieben). Dieser begrenzte Satz führt zu mnemonischen Konflikten. Konflikte führen zu Inkonsistenzen, da neue Versionen von Befehlen / Dienstprogrammen neue Funktionen erhalten .


-1

Als ich vor 20 Jahren UNIX gelernt hatte, sagte mir mein Mentor: "Sie sollten die rekursive Option immer in Großbuchstaben R eingeben. Einige Befehle haben eine andere Bedeutung für die Option r, aber Großbuchstaben R funktionieren meistens als rekursive Option überall. Und es wird Ihnen eine gute Angewohnheit geben, auf [rm * -Rf] vorsichtig zu sein, indem Sie ärgerlich die Umschalttaste drücken, wenn Sie R eingeben. "


2
Es wäre besser gewesen, wenn er Sie gebeten hätte, das Handbuch für den Befehl auf dem jeweiligen System zu lesen, auf dem Sie sich befinden, da nicht standardmäßige Optionen zwischen den Implementierungen von Tools durchaus unterschiedlich sein können.
Kusalananda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.