Sự khác biệt giữa -r và -R


32

Nó thường xảy ra rằng tôi muốn áp dụng một hoạt động đệ quy. Một số lệnh, chẳng hạn như grep, sử dụng chữ thường r để biểu thị đệ quy. Ví dụ

grep -r foo .

Các lệnh khác dường như thích chữ hoa R:

chmod -R 755 .

Tôi liên tục nhận được những cách sai lầm xung quanh và quên đi cái nào là cái đó. Có logic nào đằng sau việc lựa chọn trường hợp cho các đối số này không?


1
"Bởi vì các lập trình viên nghĩ rằng nó hợp lý." (không nói đây là một lý do chính đáng, nhưng có lẽ đó là sự thật)
HalosGhost

1
Đối với những gì nó có giá trị, mặc dù không có nhiều lệnh dường như hiểu --recursive, chúng không có khả năng làm sai.
Tanner Swett

4
trong trường hợp của chmod, đó là vì -rcó nghĩa là bỏ đặt bit đọc cho tất cả các cấp
HorusKol

Câu trả lời:


37

Hầu hết các lệnh POSIX có tùy chọn thư mục traversal đệ quy ( ls, chmod, chgrp, chmod, cp, rm) có -Rcho điều đó.

rmcũng có -rbởi vì đó là những gì ban đầu, rất lâu trước POSIX.

Bây giờ, hành vi khác nhau khi các liên kết tượng được tìm thấy khi đi xuống cây. POSIX đã cố gắng làm cho mọi thứ nhất quán bằng cách thêm -L/ -H/ Ptùy chọn để cung cấp cho người dùng cơ hội quyết định những việc cần làm với symlink để mặc định khi không được cung cấp không xác định.

POSIX grepkhông có -rhoặc -R.

GNU grepban đầu không có. -rđã được thêm vào năm 1998. Đó là sau các liên kết tượng trưng.

-Rđã được thêm vào như một từ đồng nghĩa vào năm 2001 để thống nhất với các tiện ích khác. Đó vẫn là theo symlink.

Vào năm 2012 (grep 2.12), -rđã được thay đổi để nó không còn theo các liên kết tượng trưng, ​​có thể vì -L, -Hđã được sử dụng cho mục đích khác.

BSD grepdựa trên GNU grep trong một thời gian dài. Một số trong số họ đã viết lại riêng của họ và giữ ít nhiều khả năng tương thích với GNU grep. Apple OS / X đã giải quyết vấn đề liên kết tượng trưng khác nhau. -r-Rgiống nhau và không theo liên kết tượng trưng. -STuy nhiên, có một tùy chọn hoạt động như chmod/ cp/ find's -Ltùy chọn để theo liên kết tượng trưng.


13
TL; DR : Lịch sử.
Sammitch

10
Lịch sử ban đầu: rmđã có một lựa chọn đệ quy trước những người khác. Nó đã được -r. Sau đó cpđạt được một kết hợp -r. Sau đó lsmuốn có một tùy chọn đệ quy, nhưng ls -rđã có nghĩa là "sắp xếp ngược" vì vậy nó phải như vậy -R. Có sự căng thẳng giữa -R-rbắt đầu. -Rlà thứ duy nhất có thể được thêm một cách nhất quán vào mọi tiện ích có liên quan, nhưng rm -rđã là cách sử dụng truyền thống nổi tiếng. Sau đó GNU xuất hiện và nói "tính nhất quán và truyền thống là dành cho hình vuông, anh bạn!"

8

Không có gì. Nó chỉ đơn giản phụ thuộc vào những gì các nhà phát triển đã chọn. Nó thường là bởi vì cả hai -r-Rlà tùy chọn hợp lệ. Trong các chương trình bạn trích dẫn, ví dụ:

  • các phiên bản gần đây của 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.
    
  • chmodkhông có -rtùy chọn vì vậy, có lẽ, các nhà phát triển thích -R. Tuy nhiên, tất nhiên, -rlà một chuỗi quyền hợp lệ (như được chỉ ra bởi @Arkadiusz Drabchotso) nên nó không thực sự được sử dụng ở đó.


grepPhiên bản của bạn là gì? GNU grep 2.12 -r-Rgiống nhau. Với chmod, -Rđược xác định bởi POSIX.
cuonglm

@Gnouc grep (GNU grep) 2.15và tôi nhớ đã thấy điều này trong các phiên bản trước. Bạn có chắc chắn đó không phải là trường hợp của bạn? Họ cung cấp về cơ bản cùng một kết quả trong hầu hết các trường hợp, họ chỉ hành xử khác nhau với các liên kết. Đối với chmod, nó cũng có thể được xác định bởi POSIX nhưng đó vẫn là, có lẽ, vì bản gốc chmoddevs chọn Rhơn r.
terdon

2
@Gnouc Doho! Rõ ràng, họ không thể sử dụng -rvì đó đã là một chuỗi quyền hợp lệ.
terdon

3

Chủ yếu, nó đi xuống một sở thích cá nhân của nhà phát triển. Tuy nhiên, đôi khi, một tùy chọn chữ hoa được chọn nếu tùy chọn chữ thường ưa thích được thực hiện cho một thứ khác mà các nhà phát triển tin là quan trọng hơn, ví dụ, hoạt động đệ quy. Trong trường hợp chmod -rlà một chế độ hợp lệ. Ví dụ:

$ 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

Tôi liên tục nhận được những cách sai lầm xung quanh và quên đi cái nào là cái đó.

Nếu có thể, hãy sử dụng các phiên bản GNU của các tiện ích này và sau đó bạn có thể sử dụng tên dài hơn cho các tùy chọn.

command --recursive

Có logic nào đằng sau việc lựa chọn trường hợp cho các đối số này không?

Không.

Hoặc không nhiều. Các tiện ích Unix được phát triển từng phần và các tùy chọn lệnh phản ánh các lựa chọn riêng lẻ của các nhà phát triển chính hoặc duy nhất của họ. Chỉ có 26 chữ cái tùy chọn chữ thường ASCII có sẵn, đó là bộ được ưu tiên (các lệnh thường ở dạng chữ thường để dễ gõ) và bộ giới hạn này dẫn đến xung đột ghi nhớ. Xung đột dẫn đến sự không nhất quán khi các phiên bản mới của lệnh / tiện ích đạt được các tính năng mới .


-1

Cách đây 20 năm khi tôi học UNIX, người cố vấn của tôi đã nói với tôi như thế này: "Bạn nên gõ tùy chọn đệ quy bằng chữ hoa chữ thường. Bởi vì một số lệnh có ý nghĩa khác nhau đối với tùy chọn chữ thường, nhưng chữ hoa R chủ yếu hoạt động như tùy chọn đệ quy Và nó sẽ cho bạn một thói quen tốt để thận trọng với [rm * -Rf] bằng cách nhấn phím shift khó chịu khi gõ R. "


2
Sẽ tốt hơn nếu anh ấy bảo bạn đọc hướng dẫn sử dụng lệnh trên hệ thống cụ thể mà bạn đang sử dụng, vì các tùy chọn không chuẩn có thể khác nhau giữa việc triển khai các công cụ.
Kusalananda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.