ความสำคัญของตัวเลือกคำสั่ง?


21

ฉันรู้ว่าrm -f file1จะลบอย่างแรงfile1โดยไม่แจ้งให้ฉัน

ฉันก็รู้ว่าrm -i file1จะแจ้งให้ฉันก่อนที่จะลบfile1

ตอนนี้ถ้าคุณดำเนินการrm -if file1สิ่งนี้จะเป็นการลบอย่างแรงfile1โดยไม่แจ้งให้ฉันทราบ

แต่ถ้าคุณดำเนินการก็จะแจ้งให้ผมก่อนที่จะลบrm -fi file1file1

เป็นจริงหรือไม่ที่เมื่อรวมตัวเลือกคำสั่งตัวสุดท้ายจะมีความสำคัญกว่ากัน? เช่นrm -ifนั้น-fจะมีความสำคัญกว่า แต่ rm -fiก็-iจะมีความสำคัญกว่า

lsคำสั่งเช่นมันไม่สำคัญว่าถ้าคุณบอกว่าหรือls -latRls -Rtal

ดังนั้นฉันคิดว่ามันสำคัญเฉพาะเมื่อคุณมีตัวเลือกคำสั่งที่ขัดแย้งเช่นrm -ifนั้นถูกต้องหรือไม่


คำตอบ:


23

เมื่อใช้rmกับทั้ง ตัวเลือก-iและ-fตัวเลือกแรกจะถูกละเว้น นี่เป็นเอกสารในมาตรฐานPOSIX :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

และในinfoหน้าGNU ด้วย:

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

ลองดูสิ่งที่เกิดขึ้นภายใต้ประทุน:

rmประมวลผลตัวเลือกที่มีเฉพาะgetopt(3) getopt_longฟังก์ชันนี้จะประมวลผลอาร์กิวเมนต์ตัวเลือกในบรรทัดคำสั่ง ( **argv) ตามลำดับที่ปรากฏ:

หาก getopt () ถูกเรียกซ้ำ ๆ กันมันจะส่งคืนอักขระแต่ละตัวเลือกอย่างต่อเนื่องจากองค์ประกอบตัวเลือกแต่ละตัว

ฟังก์ชั่นนี้มักจะเรียกว่าเป็นวงจนกว่าตัวเลือกทั้งหมดจะถูกประมวลผล จากมุมมองฟังก์ชั่นนี้ตัวเลือกที่มีการประมวลผลตามลำดับ อย่างไรก็ตามสิ่งที่เกิดขึ้นจริงขึ้นอยู่กับแอปพลิเคชันเนื่องจากตรรกะของแอปพลิเคชันสามารถเลือกที่จะตรวจสอบตัวเลือกที่ขัดแย้งกันแทนที่พวกเขาหรือแสดงข้อผิดพลาด สำหรับกรณีrmและiและfตัวเลือกพวกเขาเขียนทับแต่ละคนได้อย่างสมบูรณ์แบบ จากrm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

ตัวเลือกทั้งสองตั้งค่าตัวแปรเดียวกันและสถานะของตัวแปรเหล่านี้จะเป็นตัวเลือกใดก็ตามที่อยู่ในบรรทัดคำสั่ง ผลของสิ่งนี้สอดคล้องกับมาตรฐาน POSIX และrmเอกสารประกอบ


3
คำสั่งส่วนใหญ่จะประมวลผล args ตามลำดับและอาจมีข้อผิดพลาดเกี่ยวกับข้อขัดแย้งหรือทำการตั้งค่าล่าสุด (เช่นrm) ฉันคิดว่ามันยากสำหรับคำสั่งที่จะใช้การตั้งค่าแรกของตัวเลือกและละเว้น args ที่จะเปลี่ยนตัวเลือกที่ตั้งไว้แล้ว
Peter Cordes

7

ใช่เพราะrmถูกต้อง หากตัวเลือกสุดท้ายจะแทนที่รายการก่อนหน้า แต่ขึ้นอยู่กับแต่ละโปรแกรมเอง จาก´info rm´

'-f' '- บังคับใช้' ละเว้นไฟล์ที่ไม่มีอยู่และตัวถูกดำเนินการที่หายไปและไม่แสดงพร้อมท์ให้กับผู้ใช้ ไม่ต้องสนใจตัวเลือก '- แบบโต้ตอบ' ('-i') ก่อนหน้านี้

'-i' พร้อมท์ว่าจะลบแต่ละไฟล์หรือไม่ หากการตอบกลับไม่ได้รับการยืนยันไฟล์จะถูกข้ามไป ละเว้นตัวเลือก '--force' ('-f') ก่อนหน้า เทียบเท่ากับ '--interactive = always'

ตามคำใบ้ทั่วไป: infoมักจะมีรายละเอียดมากกว่าmanซึ่งมักจะมีรายละเอียดมากกว่า--helpตัวเลือก


7

ไม่มี "ลำดับความสำคัญ" สำหรับแฟล็กแต่ละโปรแกรมจัดการกับวิธีที่ต้องการ ส่วนใหญ่พยายามรวบรวมธงทั้งหมดและตรวจสอบความขัดแย้งสำหรับเครื่องมือมาตรฐาน (เช่นที่อ้างอิงrm(1)) มาตรฐานที่เกี่ยวข้องอาจมอบอะไรบางอย่าง (แต่แล้วอีกครั้งเวอร์ชันเฉพาะของคุณอาจเลอะเทอะในการตีความมุมกรณีของมาตรฐาน / ไม่ได้รับการทดสอบโดยเฉพาะ สำหรับพวกเขา).

สำหรับโปรแกรมเมอร์ที่เขียนโปรแกรมมันเป็นวิธีที่ง่ายที่สุดในการพิจารณาข้อโต้แย้ง (ค่าสถานะและอื่น ๆ ) ตามลำดับจากซ้ายไปขวาอย่างเข้มงวดและอาจประกันตัวเมื่อกดปุ่มอุปสรรค์ หากใช้ไลบรารีเพื่อจัดการกับสถานะ (เช่นgetopt(3)มีหลายเวอร์ชันที่ลอยอยู่รอบ ๆ ) โปรแกรมเมอร์น่าจะทำสิ่งที่ง่ายที่สุด / เป็นธรรมชาติมากที่สุด โปรแกรมเมอร์คือคนคนขี้เกียจ (หรืออย่างน้อยก็ไม่ชอบคิดเรื่องการระเบิดแบบ combinatorial)

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