La différence entre -r et -R

32

Il arrive souvent que je veuille appliquer une opération de manière récursive. Certaines commandes, telles que grep, utilisent une minuscule r pour indiquer une récursion. Par exemple

grep -r foo .

D'autres commandes semblent préférer un R majuscule:

chmod -R 755 .

Je suis constamment dans le mauvais sens et j'oublie qui est qui. Y at-il une logique derrière la sélection des arguments pour ces arguments?

Cjol
la source
1
"Parce que les codeurs ont pensé que c'était raisonnable." (ne dis pas que c'est une bonne raison, mais c'est probablement la vérité)
HalosGhost
1
Pour ce que cela vaut, même si peu de commandes semblent comprendre --recursive, elles ne risquent pas de faire la mauvaise chose.
Tanner Swett
4
dans le cas de chmod, c'est parce que cela -rsignifie de désactiver le bit de lecture pour tous les niveaux
HorusKol

Réponses:

37

La plupart des commandes POSIX qui ont l' option récursive répertoire traversal ( ls, chmod, chgrp, chmod, cp, rm) ont -Rpour cela.

rma également -rparce que c'est ce qu'il était à l'origine, bien avant POSIX.

Maintenant, le comportement varie lorsque des liens symboliques sont trouvés en descendant dans l’arbre. POSIX a essayé de rendre les choses cohérentes en ajoutant les options -L/ -H/ Ppour donner à l’utilisateur une chance de décider quoi faire avec les liens symboliques, en laissant la valeur par défaut lorsque aucun n’est fourni.

POSIX grepn'a pas -rou -R.

GNU grepn'avait initialement ni l'un ni l'autre. -ra été ajouté en 1998. Cela faisait suite aux liens symboliques.

-Ra été ajouté comme synonyme en 2001 pour assurer la cohérence avec les autres services publics. Cela suivait toujours les liens symboliques.

En 2012 (grep 2.12), il a -rété modifié afin de ne plus suivre les liens symboliques, probablement parce que -L, -Hétaient déjà utilisés pour autre chose.

Les BSD grepétaient basés sur GNU grep pendant longtemps. Certains d'entre eux ont réécrit leurs propres et ont gardé plus ou moins la compatibilité avec GNU grep. Apple OS / X a abordé le problème du lien symbolique différemment. -ret -Rsont les mêmes et ne suivent pas les liens symboliques. Il y a une -Spossibilité mais qui agit comme chmod/ cp/ findl » -Loption de suivre les liens symboliques.

Stéphane Chazelas
la source
13
TL; DR : Histoire.
Sammitch
10
Histoire ancienne: rmavait une option récursive avant les autres. C'était -r. Puis cpgagné une correspondance -r. Ensuite, lsje voulais avoir une option récursive, mais cela ls -rsignifiait déjà "tri en sens inverse" -R. Là la tension entre -Ret a -rcommencé. -Rétait le seul à pouvoir être ajouté de manière cohérente à chaque utilitaire pertinent, mais rm -rétait déjà l’usage traditionnel bien connu. Puis GNU est arrivé et a déclaré: "La cohérence et la tradition sont pour les carrés, mec!"
8

Pas du tout. Cela dépend simplement de ce que les développeurs ont choisi. Il est souvent parce que les deux -ret -Rsont des options valides. Dans les programmes que vous avez cités, par exemple:

  • versions récentes de 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.
    
  • chmodn’a pas d’ -roption alors, probablement, les développeurs préfèrent -R. Cependant, bien sûr, -rest une chaîne d'autorisations valide (comme l'a souligné @Arkadiusz Drabczykso), de sorte qu'elle ne peut pas vraiment être utilisée ici.

terdon
la source
Quelle est votre grepversion? GNU grep 2.12, -ret -Rsont les mêmes. Avec chmod, -Rest défini par POSIX.
jeudi
@Gnouc grep (GNU grep) 2.15et je me souviens de l'avoir vu dans les versions précédentes. Êtes-vous sûr que ce n'est pas le cas chez vous? Ils fournissent essentiellement les mêmes résultats dans la plupart des cas, ils ne se comportent que différemment avec les liens. En ce qui concerne chmod, il peut bien être défini par POSIX , mais qui est encore, sans doute, parce que l'original chmoddevs ont choisi Rplus r.
terdon
2
@ Gnouc D'oh! De toute évidence, ils ne pouvaient pas utiliser -rcar c'est déjà une chaîne d'autorisations valide.
terdon
3

Généralement, il s'agit d'une préférence personnelle du développeur. Parfois, cependant, une option en majuscule est choisie si une option en minuscule préférée est choisie pour une autre chose que les développeurs considèrent comme étant plus importante que, par exemple, une opération récursive. En cas de chmod -rest un mode valide. Par exemple:

$ 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
la source
1

Je suis constamment dans le mauvais sens et j'oublie qui est qui.

Dans la mesure du possible, utilisez les versions GNU de ces utilitaires, puis utilisez les noms plus longs pour les options.

command --recursive

Y at-il une logique derrière la sélection des arguments pour ces arguments?

Non.

Ou pas beaucoup. Les utilitaires Unix ont été développés au coup par coup et les options de commande reflètent les choix individuels de leurs développeurs principaux ou uniques. Il n’ya que 26 lettres d’option minuscule ASCII disponibles, ce qui est le jeu préféré (les commandes sont généralement en minuscule pour faciliter la frappe), et ce jeu limité entraîne des conflits mnémoniques. Les conflits entraînent des incohérences car les nouvelles versions de commandes / utilitaires ont acquis de nouvelles fonctionnalités .

RedGrittyBrick
la source
-1

Il y a 20 ans, lorsque j'avais appris UNIX, mon mentor m'avait dit ceci: "Tu ferais mieux de taper toujours l'option récursive en majuscule R. Parce que certaines commandes ont une signification différente en option minuscule, l'option R majuscule fonctionne généralement comme une option récursive. Et cela vous donnera la bonne habitude d’être prudent sur [rm * -Rf] en agissant en appuyant sur la touche Maj. lorsque vous tapez R. "

enzoy
la source
2
Il aurait été préférable qu'il vous dise de lire le manuel de la commande correspondant au système sur lequel vous vous trouvez, car les options non standard pourraient bien être différentes entre les implémentations d'outils.
Kusalananda