สำหรับระบบ POSIX (เช่น Linux, MacOSX) อย่างน้อยสำหรับโปรแกรมที่อาจเริ่มต้นในเชลล์เทอร์มินัล (เช่นส่วนใหญ่) ฉันขอแนะนำให้ใช้วิธีการเข้ารหัส GNU (ซึ่งแสดงรายการชื่ออาร์กิวเมนต์ทั่วไป) และดูแนวทาง POSIX ยูทิลิตี้แม้สำหรับซอฟต์แวร์ที่เป็นกรรมสิทธิ์:
จัดการได้เสมอ--version
และ--help
( /bin/true
ยอมรับได้ !!) ฉันสาปแช่งผู้เขียนซอฟต์แวร์ที่ไม่เข้าใจ--help
ฉันเกลียดพวกเขา (เพราะprog --help
เป็นคำสั่งแรกที่ฉันลองใช้ในโปรแกรมใหม่)! บ่อยครั้งที่--help
สามารถย่อเป็น-h
มี--help
รายการข้อความตัวเลือกทั้งหมด (ยกเว้นกรณีที่คุณมีมากเกินไปของพวกเขา ... ในรายการกรณีที่คนส่วนใหญ่และชัดเจนหมายถึงบางman
หน้าหรือ URL บางส่วน) และค่าเริ่มต้นของตัวเลือกและบางทีอาจจะสำคัญ (และโปรแกรมเฉพาะ ) ตัวแปรสภาพแวดล้อม แสดงรายการตัวเลือกเหล่านี้เกี่ยวกับข้อผิดพลาดอาร์กิวเมนต์ตัวเลือก
ยอมรับ-a
ข้อโต้แย้งสั้น ๆ (ตัวอักษรเดียว) และมีความเทียบเท่าบาง--long-argument
ดังนั้น-a2
--long-argument=2
, --long-argument 2
; แน่นอนว่าคุณสามารถมี--only-long-argument
ชื่อบางชื่อ(สำหรับตัวเลือกที่ไม่ค่อยได้ใช้) สำหรับข้อโต้แย้งแบบกิริยาที่ไม่มีตัวเลือกพิเศษ-cf
มักได้รับการจัดการในฐานะ-c -f
ฯลฯ ดังนั้น-argument:value
ข้อเสนอของคุณแปลกและฉันไม่แนะนำให้ทำเช่นนั้น
ใช้ GLIBC getopt_longหรือดีกว่า (เช่นargp_parseใน OCaml เป็นArg
โมดูล , ... )
มักใช้-
สำหรับอินพุตหรือเอาต์พุตมาตรฐาน (หากคุณไม่สามารถทำได้ให้จัดการ/dev/stdin
& /dev/stdout
แม้แต่ในระบบปฏิบัติการบางระบบที่ไม่มีพวกเขา)
เลียนแบบพฤติกรรมของโปรแกรมที่คล้ายกันโดยการนำข้อเสนอทางเลือกส่วนใหญ่กลับมาใช้ซ้ำ โดยเฉพาะอย่างยิ่ง-n
สำหรับ dry run (à la make
), -h
เพื่อขอความช่วยเหลือ, -v
สำหรับ verbosity, ฯลฯ ...
ใช้--
เป็นตัวคั่นระหว่างตัวเลือก & ไฟล์หรืออาร์กิวเมนต์อื่น ๆ
หากโปรแกรมของคุณใช้isatty
ทดสอบมากกว่าstdinคือเทอร์มินัล (และทำงานเป็น "แบบโต้ตอบ" ในกรณีนั้น) ให้ตัวเลือกในการบังคับใช้โหมดที่ไม่มีการโต้ตอบเช่นกันถ้าโปรแกรมของคุณมีอินเทอร์เฟซ GUI (และการทดสอบgetenv("DISPLAY")
บนเดสก์ท็อป X11) นำมาใช้ในชุดหรือบรรทัดคำสั่ง
บางโปรแกรม (เช่นgcc
) ยอมรับรายการอาร์กิวเมนต์ทางอ้อมดังนั้นจึง@somefile.txt
มีความหมายว่าอ่านอาร์กิวเมนต์ของโปรแกรมจากsomefile.txt
; สิ่งนี้อาจมีประโยชน์เมื่อโปรแกรมของคุณอาจยอมรับข้อโต้แย้งจำนวนมาก (มากกว่าเคอร์เนลของคุณARG_MAX
)
BTW คุณอาจเพิ่มสิ่งอำนวยความสะดวกที่สมบูรณ์แบบอัตโนมัติสำหรับโปรแกรมและเชลล์ทั่วไป (เช่นbash
หรือzsh
)
บางคำสั่ง Unix เก่า (เช่นdd
หรือแม้กระทั่งsed
) มีอาร์กิวเมนต์คำสั่งที่แปลกสำหรับความเข้ากันได้ในอดีต ฉันจะแนะนำไม่ให้ทำตามนิสัยที่ไม่ดีของพวกเขา (ยกเว้นว่าคุณกำลังสร้างตัวแปรที่ดีกว่า)
ถ้าซอฟต์แวร์ของคุณเป็นชุดของโปรแกรมบรรทัดคำสั่งที่เกี่ยวข้องกับการใช้แรงบันดาลใจจากคอมไพล์ (ซึ่งคุณก็ใช้เป็นเครื่องมือในการพัฒนา) ซึ่งยอมรับgit help
และgit --help
มีจำนวนมากgit
subcommand
และgit
subcommand
--help
ในบางกรณีคุณอาจใช้argv[0]
(โดยใช้ symlink ในโปรแกรมของคุณ) เช่นbash
เรียกใช้เช่นเดียวกับที่rbash
มีพฤติกรรมที่แตกต่าง ( เชลล์จำกัด ) แต่ฉันมักจะไม่แนะนำให้ทำเช่นนั้น; มันอาจจะทำให้รู้สึกว่าโปรแกรมของคุณสามารถใช้เป็นล่ามสคริปต์ใช้shebangคือ#!
ในบรรทัดแรกตีความโดยexecve (2) หากคุณทำอุบายเช่นนี้ต้องแน่ใจว่าเอกสารเหล่านั้นรวมถึงใน--help
ข้อความ
โปรดจำไว้ว่าใน POSIX เปลือกเป็นglobbingข้อโต้แย้ง ( ก่อนที่จะเรียกใช้โปรแกรมของคุณ) เพื่อหลีกเลี่ยงการกำหนดตัวอักษร (ชอบ*
หรือ$
หรือ~
) ในตัวเลือกที่จะต้องมีเปลือกหนี
ในบางกรณีคุณสามารถฝังล่ามเช่นGNU guileหรือLuaในซอฟต์แวร์ของคุณ (หลีกเลี่ยงการประดิษฐ์ภาษาสคริปต์ทัวริงของคุณเองหากคุณไม่เชี่ยวชาญในภาษาโปรแกรม) สิ่งนี้มีผลกระทบในเชิงลึกต่อการออกแบบซอฟต์แวร์ของคุณ (ควรให้ความสนใจก่อน!) จากนั้นคุณควรสามารถส่งสคริปต์หรือนิพจน์บางอย่างไปยังล่ามนั้นได้อย่างง่ายดาย หากคุณใช้วิธีการที่น่าสนใจออกแบบซอฟต์แวร์ของคุณและตีความดั้งเดิมด้วยความระมัดระวัง คุณอาจมีผู้ใช้รหัสแปลก ๆ เขียนสคริปต์ขนาดใหญ่สำหรับสิ่งที่คุณ
ในกรณีอื่น ๆ คุณอาจต้องการให้ผู้ใช้ขั้นสูงโหลดปลั๊กอินลงในซอฟต์แวร์ของคุณ (โดยใช้เทคนิคการโหลดแบบไดนามิก à la dlopen
& dlsym
) นี่เป็นการตัดสินใจออกแบบที่สำคัญมาก (ดังนั้นให้กำหนดและจัดทำเอกสารส่วนต่อประสานปลั๊กอินด้วยความระมัดระวัง) และคุณจะต้องกำหนดการประชุมเพื่อส่งตัวเลือกโปรแกรมไปยังปลั๊กอินเหล่านี้
หากซอฟต์แวร์ของคุณเป็นสิ่งที่ซับซ้อนให้ยอมรับไฟล์กำหนดค่าบางอย่าง(นอกเหนือจากหรือแทนที่ข้อโต้แย้งของโปรแกรม) และอาจมีวิธีทดสอบ (หรือแยกวิเคราะห์) ไฟล์กำหนดค่าเหล่านี้โดยไม่ต้องเรียกใช้รหัสทั้งหมด ตัวอย่างเช่นเอเจนต์การถ่ายโอนเมล (เช่น Exim หรือ Postfix) ค่อนข้างซับซ้อนและมีประโยชน์ที่จะสามารถ "เรียกใช้แบบครึ่งแห้ง" (เช่นการสังเกตวิธีจัดการที่อยู่อีเมลที่ให้โดยไม่ส่งอีเมล)
ขอให้สังเกตว่า/option
เป็นสิ่งที่ Windows หรือ VMS มันจะเสียสติในระบบ POSIX (เพราะลำดับชั้นของไฟล์ใช้/
เป็นตัวคั่นไดเรกทอรีและเพราะเชลล์ทำแบบกลม) คำตอบทั้งหมดของฉันส่วนใหญ่สำหรับ Linux (และ POSIX)
PS ถ้าเป็นไปได้ทำให้โปรแกรมของคุณเป็นซอฟต์แวร์ฟรีคุณจะได้รับการปรับปรุงจากผู้ใช้บางคนและนักพัฒนา (และการเพิ่มตัวเลือกโปรแกรมใหม่มักเป็นหนึ่งในสิ่งที่ง่ายที่สุดในการเพิ่มซอฟต์แวร์ฟรีที่มีอยู่) นอกจากนี้คำถามของคุณขึ้นอยู่เป็นจำนวนมากกับผู้ชมที่ตั้งใจไว้ : เกมสำหรับวัยรุ่นหรือเบราว์เซอร์สำหรับยายอาจไม่จำเป็นต้องมีชนิดเดียวกันและปริมาณของตัวเลือกกว่าคอมไพเลอร์หรือผู้ตรวจสอบเครือข่ายสำหรับการ sysadmins ดาต้าเซ็นเตอร์หรือซอฟต์แวร์ CAD สำหรับไมโครโปรเซสเซอร์ สถาปนิกหรือนักออกแบบสะพาน วิศวกรที่คุ้นเคยกับการเขียนโปรแกรมและการเขียนสคริปต์อาจชอบตัวเลือกที่ปรับได้มากกว่าคุณยายและอาจต้องการให้สามารถเรียกใช้แอปพลิเคชันของคุณได้โดยไม่ต้องใช้ X11 (อาจเป็นcrontab
งาน)
ls -ltr
จะรวมตัวเลือก-l
, และ-t
-r
โปรแกรมสไตล์ GNU ยังมักจะช่วยให้ตัวเลือกคำที่ใช้กับยัติภังค์คู่เหมือนแทน--reverse
-r
มีการประชุมยอดนิยมอื่น ๆ ที่ต้องการ-h
แสดงความช่วยเหลือ--
เพื่อส่งสัญญาณในตอนท้ายของตัวเลือกโดยระบุ-
เป็นชื่อไฟล์ที่อนุญาตให้อ่านจาก stdin ฯลฯ