La differenza tra -r e -R


32

Accade spesso che voglio applicare un'operazione in modo ricorsivo. Alcuni comandi, come grep, usano una r minuscola per indicare la ricorsione. Per esempio

grep -r foo .

Altri comandi sembrano preferire una R maiuscola:

chmod -R 755 .

Ricevo costantemente queste cose nel modo sbagliato e dimentico quale è quale. C'è qualche logica dietro la selezione del caso per questi argomenti?


1
"Perché i programmatori hanno pensato che fosse ragionevole." (non dire questo è un buon motivo, ma probabilmente è la verità)
HalosGhost

1
Per quello che vale, anche se non molti comandi sembrano capire --recursive, è probabile che non facciano la cosa sbagliata.
Tanner Swett,

4
nel caso di chmod, è perché -rsignifica disinserire il bit di lettura per tutti i livelli
HorusKol

Risposte:


37

La maggior parte dei comandi POSIX che hanno l'opzione directory traversal ricorsiva ( ls, chmod, chgrp, chmod, cp, rm) hanno -Rper questo.

rmha anche -rperché era quello che era inizialmente, molto prima di POSIX.

Ora, il comportamento varia quando si trovano collegamenti simbolici mentre si cammina lungo l'albero. POSIX ha cercato di rendere le cose coerenti aggiungendo le opzioni -L/ -H/ Pper dare all'utente la possibilità di decidere cosa fare con i collegamenti simbolici lasciando l'impostazione predefinita quando nessuno viene fornito non specificato.

POSIX grepnon ha -ro -R.

grepInizialmente GNU non ne aveva. -rè stato aggiunto nel 1998. Ciò seguiva i symlink.

-Rè stato aggiunto come sinonimo nel 2001 per coerenza con le altre utility. Ciò seguiva ancora i symlink.

Nel 2012 (grep 2.12), è -rstato modificato in modo da non seguire più i symlink, forse perché -L, -Herano già utilizzati per qualcos'altro.

I BSD grepsono stati basati su GNU grep per molto tempo. Alcuni di loro hanno riscritto il proprio e mantenuto più o meno compatibilità con GNU grep. Apple OS / X ha risolto il problema del collegamento simbolico in modo diverso. -re -Rsono uguali e non seguono i collegamenti simbolici. C'è una -Spossibilità, tuttavia, che si comporta come chmod/ cp/ find's -Lpossibilità di seguire i link simbolici.


13
TL; DR : storia.
Sammitch,

10
Storia antica: rmaveva un'opzione ricorsiva prima delle altre. Lo è stato -r. Quindi ha cpottenuto una corrispondenza -r. Quindi lsvoleva avere un'opzione ricorsiva, ma ls -rgià significava "ordinamento inverso", quindi doveva essere -R. Lì la tensione tra -Re -rcominciò. -Rera l'unico che poteva essere aggiunto in modo coerente a ogni utilità pertinente, ma rm -rera già il noto uso tradizionale. Poi è arrivato GNU e ha detto "coerenza e tradizione sono per i quadrati, amico!"

8

Assolutamente no. Dipende semplicemente da ciò che gli sviluppatori hanno scelto. Spesso è perché entrambi -re -Rsono opzioni valide. Nei programmi che hai citato, ad esempio:

  • versioni recenti di 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.
    
  • chmodnon ha alcuna -ropzione quindi, presumibilmente, preferiscono gli sviluppatori -R. Tuttavia, ovviamente, -rè una stringa di autorizzazioni valida (come sottolineato da @Arkadiusz Drabczykso) quindi non può essere realmente utilizzata lì.


Qual è la tua grepversione? GNU grep 2.12 -re -Rsono gli stessi. Con chmod, -Rè definito da POSIX.
cuonglm,

@Gnouc grep (GNU grep) 2.15e ricordo di averlo visto nelle versioni precedenti. Sei sicuro che non sia il tuo? Forniscono essenzialmente gli stessi risultati nella maggior parte dei casi, si comportano in modo diverso solo con i collegamenti. Per quanto riguarda chmod, potrebbe essere definito da POSIX ma che è ancora, presumibilmente, perché l'originale chmodsviluppatori hanno scelto Rsopra r.
terdon

2
@Gnouc D'oh! Ovviamente, non potevano usarlo -rpoiché quella è già una stringa di autorizzazioni valida.
Terdon

3

Principalmente, si tratta di una preferenza personale dello sviluppatore. A volte, tuttavia, viene scelta un'opzione maiuscola se viene scelta un'opzione minuscola preferita per qualcos'altro che gli sviluppatori ritengono sia più importante di, ad esempio, operare in modo ricorsivo. In caso di chmod -rè una modalità valida. Per esempio:

$ 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

Ricevo costantemente queste cose nel modo sbagliato e dimentico quale è quale.

Ove possibile, utilizzare le versioni GNU di queste utility e quindi è possibile utilizzare i nomi più lunghi per le opzioni.

command --recursive

C'è qualche logica dietro la selezione del caso per questi argomenti?

No.

O non molto. Le utility Unix sono state sviluppate in modo frammentario e le opzioni di comando riflettono le scelte individuali dei loro lead o dei loro unici sviluppatori. Sono disponibili solo 26 lettere ASCII minuscole, che è l'insieme preferito (i comandi sono generalmente in minuscolo per facilitare la digitazione) e questo insieme limitato porta a conflitti mnemonici. I conflitti portano a incoerenze man mano che nuove versioni di comandi / utilità acquisiscono nuove funzionalità .


-1

20 anni fa, quando avevo imparato UNIX, il mio mentore mi disse in questo modo: "Faresti meglio a digitare sempre l'opzione ricorsiva in maiuscola R. Perché alcuni comandi hanno un significato diverso sull'opzione r minuscola, ma R maiuscola funziona principalmente come opzione ricorsiva dappertutto. E ti darà la buona abitudine di essere prudenti su [rm * -Rf] premendo il tasto maiuscole sul tasto R. "


2
Sarebbe stato meglio se ti avesse detto di leggere il manuale per il comando sul particolare sistema in cui ti trovi, poiché le opzioni non standard potrebbero ben essere diverse tra le implementazioni degli strumenti.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.