ความแตกต่างระหว่าง -r และ -R


32

มันมักจะเกิดขึ้นที่ฉันต้องการใช้การดำเนินการซ้ำ คำสั่งบางคำสั่งเช่น grep ใช้ตัวพิมพ์เล็ก r เพื่อระบุการเรียกซ้ำ ตัวอย่างเช่น

grep -r foo .

คำสั่งอื่นดูเหมือนจะชอบตัวพิมพ์ใหญ่ R:

chmod -R 755 .

ฉันได้รับอย่างต่อเนื่องในทางที่ผิดและลืมซึ่งเป็นที่ มีเหตุผลใดบ้างที่อยู่เบื้องหลังการเลือกเคสสำหรับอาร์กิวเมนต์เหล่านี้?


1
"เพราะผู้เขียนคิดว่ามันสมเหตุสมผล" (ไม่ได้บอกว่านี่เป็นเหตุผลที่ดี แต่อาจเป็นความจริง)
HalosGhost

1
สำหรับสิ่งที่มีค่าถึงแม้ว่ามีคำสั่งไม่มากที่ดูเหมือนจะเข้าใจ--recursiveแต่พวกเขาก็ไม่น่าจะทำสิ่งที่ผิด
แทนเนอร์ Swett

4
ในกรณีของ chmod มันเป็นเพราะ-rวิธีการตั้งค่าบิตการอ่านสำหรับทุกระดับ
HorusKol

คำตอบ:


37

คำสั่ง POSIX ส่วนใหญ่ที่มีตัวเลือกในการข้ามผ่านไดเรกทอรี recursive ( ls, chmod, chgrp, chmod, cp, rm) มี-Rที่

rmยังมี-rเพราะนั่นคือสิ่งที่มันเป็นครั้งแรกนานก่อนที่ POSIX

ตอนนี้พฤติกรรมแตกต่างกันเมื่อพบ symlink ในการเดินลงต้นไม้ POSIX พยายามที่จะทำในสิ่งที่สอดคล้องกันโดยการเพิ่ม-L/ -H/ Pตัวเลือกเพื่อให้ผู้ใช้มีโอกาสที่จะตัดสินใจว่าจะทำอย่างไรกับ symlinks ออกจากเริ่มต้นเมื่อไม่มีผู้ใดเป็นผู้ให้บริการที่ไม่ได้ระบุ

POSIX grepไม่เคยมีใครหรือ-r-R

GNU grepเริ่มแรกไม่มี -rถูกเพิ่มในปี 1998 นั่นคือการติดตาม symlink

-Rถูกเพิ่มเป็นคำพ้องในปี 2001 เพื่อให้สอดคล้องกับสาธารณูปโภคอื่น ๆ นั่นคือยังคงติดตาม symlink

ในปี 2012 (grep 2.12) -rก็เปลี่ยนไปจึงไม่ได้ตาม symlinks อาจจะเป็นเพราะ-L, -Hถูกนำมาใช้แล้วอย่างอื่น

BSD grepอ้างอิงจาก GNU grep เป็นเวลานาน บางส่วนของพวกเขาได้เขียนใหม่ของตัวเองและเก็บเข้ากันได้มากขึ้นหรือน้อยลงด้วย grepGNU Apple OS / X แก้ไขปัญหา symlink ต่างกัน -rและ-Rเหมือนกันและไม่ติดตาม symlinks มีความเป็น-Sตัวเลือก แต่ที่ทำหน้าที่เหมือนchmod/ cp/ find's -Lตัวเลือกที่จะปฏิบัติตาม symlinks


13
TL; DR : ประวัติ
Sammitch

10
ก่อนประวัติศาสตร์: rmมีตัวเลือกแบบเรียกซ้ำก่อนคนอื่น ๆ -rมันเป็น จากนั้นได้รับการจับคู่cp -rแล้วlsอยากจะมีตัวเลือก recursive แต่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ตัวเลือกเพื่อให้สันนิษฐานว่า devs -Rชอบ อย่างไรก็ตามแน่นอนว่า-rเป็นสตริงการอนุญาตที่ถูกต้อง (ตามที่ระบุโดย @Arkadiusz Drabczykso) ดังนั้นจึงไม่สามารถใช้งานได้จริง


grepรุ่นของคุณคืออะไร? GNU grep 2.12 -rและ-Rเหมือนกัน ด้วย chmod -Rถูกกำหนดโดย POSIX
cuonglm

@Gnouc grep (GNU grep) 2.15และฉันจำได้ว่าเห็นสิ่งนี้ในรุ่นก่อนหน้า คุณแน่ใจหรือว่าไม่ใช่ในกรณีของคุณ? พวกเขาให้ผลลัพธ์ที่เหมือนกันเป็นหลักในกรณีส่วนใหญ่พวกเขาทำงานแตกต่างกับลิงค์เท่านั้น ในฐานะที่เป็นchmodก็อาจจะกำหนดโดย POSIX แต่ที่ยังคงเป็นที่สันนิษฐานว่าเพราะเดิมchmoddevs เลือกมากกว่าR r
terdon

2
@Gnouc D'oh! เห็นได้ชัดว่าพวกเขาไม่สามารถใช้งานได้-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 ตัวเท่านั้นซึ่งเป็นชุดที่ต้องการ (โดยทั่วไปคำสั่งจะเป็นตัวพิมพ์เล็กเพื่อความสะดวกในการพิมพ์) และชุดที่ จำกัด นี้นำไปสู่ ความขัดแย้งนำไปสู่ความไม่สอดคล้องกันกับรุ่นใหม่ของคำสั่ง / สาธารณูปโภคได้รับคุณสมบัติใหม่


-1

20 ปีที่แล้วเมื่อฉันได้เรียนรู้ UNIX ที่ปรึกษาของฉันบอกฉันว่า: "คุณควรที่จะพิมพ์ตัวเลือกซ้ำในตัวพิมพ์ใหญ่ R เสมอเพราะคำสั่งบางคำมีความหมายแตกต่างกันในตัวเลือกตัวพิมพ์เล็ก แต่ตัวพิมพ์ใหญ่ส่วนใหญ่ทำงานเป็นตัวเลือกแบบเรียกซ้ำ ทุกที่และมันจะทำให้คุณมีนิสัยที่ดีที่จะต้องระมัดระวังในการ [rm * -Rf] โดยการกดปุ่ม Shift ที่น่ารำคาญในการพิมพ์อาร์ "


2
คงจะดีกว่าถ้าเขาบอกให้คุณอ่านคู่มือสำหรับคำสั่งในระบบเฉพาะที่คุณเปิดอยู่เนื่องจากตัวเลือกที่ไม่ได้มาตรฐานอาจแตกต่างกันระหว่างการใช้งานเครื่องมือ
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.