-r和-R之间的区别


32

我经常需要递归地应用操作。某些命令(例如grep)使用小写字母r表示递归。例如

grep -r foo .

其他命令似乎更喜欢大写的R:

chmod -R 755 .

我不断地以错误的方式解决这些问题,而忘记了哪一个。在为这些论据选择大小写的背后有逻辑吗?


1
“因为编码人员认为这是明智的。” (不是说这是一个很好的理由,但这可能是事实)
HalosGhost 2014年

1
就其价值而言,尽管似乎没有多少命令可以理解--recursive,但它们不太可能做错事。
Tanner Swett 2014年

4
对于chmod来说,这是因为-r意味着要取消所有级别的读取位
HorusKol 2014年

Answers:


37

有递归遍历目录选项的大多数POSIX命令(lschmodchgrpchmodcprm),都-R为。

rm也有-r因为那是最初的样子,早于POSIX。

现在,当在树上行走时找到符号链接时,行为会有所不同。POSIX试图通过添加-L/ -H/ P选项使事情保持一致,以便用户有机会决定如何处理符号链接,而在未指定未提供符号链接的情况下保留默认值。

POSIX grep没有-r-R

GNU grep最初没有。-r是在1998年添加的。

-R在2001年被添加为同义词,以与其他实用程序保持一致。那仍在遵循符号链接。

在2012年(grep 2.12)-r进行了更改,因此不再遵循符号链接,可能是因为-L,该链接-H已用于其他用途。

BSD grep基于GNU grep已有很长时间了。其中一些已经重写了自己的版本,并与GNU或多或少保持了兼容性grep。Apple OS / X解决符号链接问题的方式有所不同。-r并且-R是相同的,并且不遵循符号链接。-S但是,有一个选项的行为类似于chmod/ cp/ find-L选项以跟随符号链接。


13
TL; DR:历史。
Sammitch 2014年

10
早期历史:rm在其他选项之前有递归选项。是-r。然后cp获得了匹配-r。当时ls想拥有一个递归选项,但是ls -r已经意味着“反向排序”,所以必须是-R。有之间的紧张关系-R,并-r开始了。-R是唯一可以一致地添加到每个相关实用程序中的应用程序,但是rm -r已经是众所周知的传统用法。然后GNU出现了,说:“一致性和传统适用于正方形,伙计!”

8

没有任何。它仅取决于开发人员的选择。通常是因为-r-R是有效的选项。在您引用的程序中,例如:

  • 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没有-r选择,因此,大概是开发人员更喜欢-R。但是,当然-r是有效的权限字符串(如@Arkadiusz Drabczykso 所指出的),因此不能在此处真正使用它。


您的grep版本是?GNU grep 2.12 -r和之前-R相同。使用chmod,-R由POSIX定义。
cuonglm 2014年

@Gnouc grep (GNU grep) 2.15和我记得在以前的版本中看到过这一点。您确定不是这种情况吗?在大多数情况下,它们提供的结果基本相同,只是链接的行为不同。至于chmod它,它很可能由POSIX定义,但这仍然可能是因为原始chmod开发者选择Rr
terdon

2
@Gnouc D'哦!显然,他们不能使用,-r因为那已经是一个有效的权限字符串。
terdon

3

通常,这取决于开发人员的个人喜好。但是,有时,如果对于开发人员认为比例如递归操作更重要的其他内容采用了首选的小写字母选项,则会选择一个大写字母选项。如果chmod -r是有效模式。例如:

$ 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

我不断地以错误的方式解决这些问题,而忘记了哪一个。

尽可能使用这些实用程序的GNU版本,然后可以使用较长的名称作为选项。

command --recursive

在为这些论据选择大小写的背后有逻辑吗?

没有。

还是不多。Unix实用程序是逐项开发的,命令选项反映了其主要或唯一开发人员的个人选择。只有26个ASCII小写选项字母可用,这是首选集合(命令通常使用小写字母,以便于键入),并且此有限的集合会导致助记符冲突。随着新版本的命令/实用程序获得新功能,冲突导致不一致。


-1

20年前,当我学习UNIX时,我的导师这样告诉我:“您最好总是在大写R中键入递归选项。因为某些命令在小写r选项上具有不同的含义,但是大写R通常用作递归选项到处都是,这会给您带来一个好习惯,因为您讨厌在键入R时按Shift键,对[rm * -Rf]保持谨慎。”


2
如果他让您阅读所用特定系统上的命令手册,那就更好了,因为在工具实现之间,非标准选项可能会有所不同。
Kusalananda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.