A diferença entre -r e -R

29

Muitas vezes acontece que eu quero aplicar uma operação recursivamente. Alguns comandos, como o grep, usam um r minúsculo para indicar recursão. Por exemplo

grep -r foo .

Outros comandos parecem preferir um R maiúsculo:

chmod -R 755 .

Eu estou constantemente fazendo o caminho errado e esquecendo qual é qual. Existe alguma lógica por trás da seleção de argumentos para esses argumentos?

    
por cjol 09.09.2014 / 16:33

4 respostas

31

A maioria dos comandos POSIX que possuem a opção de passagem de diretório recursiva ( ls , chmod , chgrp , chmod , cp , rm ) tem -R para isso.

rm também tem -r porque é o que era inicialmente.

Agora, o comportamento varia quando os links simbólicos são encontrados ao percorrer a árvore. O POSIX tentou tornar as coisas consistentes adicionando as opções -L / -H / P para dar ao usuário uma chance de decidir o que fazer com links simbólicos deixando o padrão quando nenhum é fornecido sem especificação.

POSIX grep não possui -r ou -R .

GNU grep inicialmente não tinha nenhum. -r foi adicionado em 1998. Isso estava seguindo os links simbólicos.

-R foi adicionado como sinônimo em 2001 para consistência com os outros utilitários. Isso ainda estava seguindo links simbólicos.

Em 2012 (grep 2.12), -r foi alterado, de modo que deixou de seguir os links simbólicos, possivelmente porque -L , -H já foram usados para outra coisa.

BSDs grep foram baseados no GNU grep por um longo tempo. Alguns deles reescreveram seus próprios e mantiveram mais ou menos compatibilidade com o GNU grep . O Apple OS / X solucionou o problema do symlink de maneira diferente. -r e -R são os mesmos e não seguem links simbólicos. No entanto, existe uma opção -S que age como chmod / cp / find -L para seguir links simbólicos.

    
por 09.09.2014 / 16:58
6

Nenhum. Isso simplesmente depende do que os desenvolvedores escolheram. Geralmente, é porque as opções -r e -R são válidas. Nos programas que você citou, por exemplo:

  • versões recentes do 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.
    
  • chmod não tem a opção -r , então, presumivelmente, os desenvolvedores preferem -R . No entanto, é claro, -r é uma string de permissões válida (como apontada por @Arkadiusz Drabczykso) realmente ser usado lá.

por 09.09.2014 / 16:40
3

Principalmente, tudo se resume a uma preferência pessoal do desenvolvedor. Às vezes, no entanto, uma opção maiúscula é escolhida se uma opção minúscula preferida é tomada para outra coisa que os desenvolvedores acreditam ser mais importante do que, por exemplo, operar recursivamente. No caso de chmod -r é um modo válido. Por exemplo:

$ 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
    
por 09.09.2014 / 16:45
0

I am constantly getting these the wrong way around and forgetting which is which.

Sempre que possível, use as versões GNU desses utilitários e, em seguida, você pode usar os nomes mais longos para as opções.

command --recursive

Is there any logic behind the selection of case for these arguments?

Não.

Ou não muito. Os utilitários Unix foram desenvolvidos de forma fragmentada e as opções de comando refletem as escolhas individuais de seus desenvolvedores principais ou únicos. Existem apenas 26 letras de opção minúsculas ASCII disponíveis, que é o conjunto preferido (os comandos geralmente estão em letras minúsculas para facilitar a digitação), e esse conjunto limitado leva a conflitos mnemônicos. Conflitos levam a inconsistência à medida que novas versões de comandos / utilitários ganham novos recursos .

    
por 10.09.2014 / 14:51