เครื่องหมายขีดกลางเดี่ยว `- 'สำหรับตัวเลือกอักขระเดียว แต่ขีดกลางสองเท่า' - 'สำหรับคำ?


51

แบบแผนของการใช้เครื่องหมายขีดกลางเดี่ยวสำหรับตัวอักษรและเครื่องหมายขีดกลางคู่สำหรับคำมาจากไหนและทำไมจึงยังคงใช้ต่อไป

ตัวอย่างเช่นถ้าฉันพิมพ์ls --helpคุณจะเห็น:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

ฉันลอง googling - and -- conventionแม้จะมีคำพูดที่ประสบความสำเร็จ


6
ก็แค่คนจู้จี้จุกจิกที่นี่ แต่ตัวละครตัวนี้-เป็นเทคนิคที่เรียกว่ายัติภังค์ เราใช้คำว่า "เส้นประ" เพื่ออ้างถึงเส้นประ em (-) ในกรณีส่วนใหญ่และบางครั้งก็เป็นเส้นประ (-) แต่ไม่มีทั้งเครื่องหมายยัติภังค์ (-)
chharvey

4
มันทำให้ฉันรำคาญจริงๆเมื่อโปรแกรมที่รู้จักกันดีไม่ปฏิบัติตามอนุสัญญาแม้ว่า:java -version
Kimberly W

4
@Jamil ใช่ ฉันสิ้นสุดที่นี่สงสัยว่าทำไมมันfind . -delete
Krzysztof Wende

ความคิดของเรื่องนี้ก็คือเพื่อให้คุณสามารถเขียนสิ่งที่ต้องการ-abที่จะเปิดใช้งานทั้งในและa bโดยไม่ต้องรีบคู่-helpจะเปิดใช้งานh, e, lและpตัวเลือก
Aaron Franke

คำตอบ:


61

ในการเขียนโปรแกรมศิลปะของ Unix Eric Steven Raymond อธิบายวิธีการพัฒนานี้:

ในประเพณี Unix ดั้งเดิมตัวเลือกบรรทัดคำสั่งเป็นตัวอักษรตัวเดียวนำหน้าด้วยยัติภังค์เดียว ... รูปแบบ Unix ดั้งเดิมพัฒนาขึ้นมาบนตัวเครื่อง ASR-33 ที่ช้าซึ่งทำให้เกิดความทนทาน ดังนั้นตัวเลือกตัวอักษรเดียว การกดปุ่ม Shift ค้างไว้ต้องใช้ความพยายามจริง ดังนั้นการตั้งค่าสำหรับกรณีที่ต่ำกว่าและการใช้“ -” (แทนที่จะเป็นตรรกะมากกว่า“ +”) เพื่อเปิดใช้งานตัวเลือก

รูปแบบของ GNU ใช้คำหลักตัวเลือก (แทนที่จะเป็นตัวอักษรคำหลัก) นำหน้าด้วยเครื่องหมายขีดคั่นสองตัว มันวิวัฒนาการมาหลายปีต่อมาเมื่อบางส่วนของสาธารณูปโภค GNU ที่ค่อนข้างซับซ้อนที่ซับซ้อนเริ่มที่จะหมดคีย์ตัวเลือกตัวอักษรเดียว ( นี้ประกอบไปด้วยการแก้ไขสำหรับอาการที่ไม่รักษาโรคพื้นฐาน ) มันยังคงได้รับความนิยมเนื่องจากตัวเลือก GNU อ่านง่ายกว่าตัวอักษรซุปสไตล์เก่า 1

[1] http://www.faqs.org/docs/artu/ch10s05.html


โปรดทราบว่า getopt () ถูกตีพิมพ์ครั้งแรกในปี 1985 แต่ UNOS (โคลนที่เก่าแก่ที่สุดของ UNIX) เผยแพร่ getargs () ในปี 1982 แล้ว (เขียนในปี 1980) และ getargs () รองรับตัวเลือกสั้น ๆ และตัวเลือกแบบยาวเดียว UNOS ใช้ตัวเลือกแบบยาวขนาดใหญ่และ UNOS เขียนโดยอดีตพนักงานของ AT&T ในปี 1988 GNU ออกมาพร้อมกับตัวเลือกความยาวสองเท่าแม้ว่า UNOS จะตรวจสอบว่าตัวเลือกความยาวเส้นประเดียวนั้นใช้งานได้ดี
schily

28

เหตุผลหนึ่งที่ต่อเนื่องในการใช้ตัวเลือกตัวอักษรเดียวเป็นเพราะพวกเขาสามารถจะเครียดกันls -ltrเป็นจำนวนมากls --sort=time --reverse --format=longง่ายต่อการพิมพ์กว่า มีหลายครั้งที่ทั้งคู่ใช้งานได้ดี สำหรับการค้นหาหัวข้อนี้ให้ลอง "อนุสัญญาตัวเลือกบรรทัดคำสั่ง unix"


1
+1 ขอบคุณสิ่งนี้ช่วยได้จริงกับตรรกะที่อยู่เบื้องหลังการใช้งาน
Larry

เนื่องจาก UNIX ls ไม่เข้าใจls --sort=time --reverse --format=longจึงไม่ควรพูดถึงวิธีการที่ไม่ได้มาตรฐานนี้
schily

6

อ้างจากเรย์มอนด์โดย @jasonwryan มีข้อมูลที่เป็นประโยชน์บางอย่าง แต่จะเริ่มต้นในช่วงกลางของเรื่อง:

  • โปรดทราบว่า Unix เริ่มต้นเป็นรุ่น Multic ที่มีขอบเขตลดลงและตลอดประวัติศาสตร์คุณลักษณะใน Unix มักจะเลียนแบบหรือดัดแปลงคุณสมบัติที่เห็นและใช้กับระบบอื่น ๆ
  • '-'ตัวละครตัวเลือกที่ถูกใช้ใน Multics Bitsavers มีคู่มือของคำสั่งของผู้ใช้
  • ระบบอื่น ๆ ใช้อักขระที่แตกต่างกันบางตัวมีการอ้างสิทธิ์มากกว่าว่าจะมีการกดแป้นพิมพ์ที่มีประสิทธิภาพมากกว่า (เช่น'/'ใช้สำหรับ TOPS และ VMS) และบางส่วนน้อยกว่า (เช่น'('ใช้ใน VM / SP CMS)
  • ตัวเลือก Multics เป็นอักขระหลายตัวเช่นคำหลักคั่นด้วยเครื่องหมายขีดล่าง
  • ตัวเลือก Multic ที่ยาวกว่ามักจะมีรูปแบบที่สั้นกว่าเช่นตัวย่อ( -printvs -pr3-8)
  • ตัวเลือกระบบปฏิบัติการยูนิกซ์เป็นตัวเดียวและหลังจากหลายปีที่ผ่านมาgetoptได้รับการแนะนำ เพราะมันไม่ได้เป็นส่วนหนึ่งของ Unix ดั้งเดิมมีสาธารณูปโภคที่ไม่ได้ใช้getoptและถูกทิ้งให้เป็น - แต่ต้องgetoptช่วยกันทำโปรแกรมให้สอดคล้องกัน

ในทางกลับกันตัวเลือก Unix ที่ใช้getoptคืออักขระเดี่ยว ระบบอื่น ๆ โดยเฉพาะคำหลักที่ใหญ่กว่าทั้งหมดใช้คำหลัก บางคำ (ไม่ใช่ทั้งหมด) อนุญาตให้คำหลักเหล่านั้นย่อได้นั่นคือไม่ใช่อักขระทั้งหมดที่มีให้ตราบใดที่ตัวเลือกนั้นไม่คลุมเครือ มีข้อผิดพลาดในการทดสอบความกำกวมนั้น ตัวอย่างเช่น:

  • ในช่วงต้นปี 1985 ผมทำงานในโปรแกรมที่จะต้องมีการแจ้งความไปยังPrimos นักพัฒนาของ Prime ทำการแข่งขันกับ บริษัท อื่น ๆ โดยเสนอคำสั่งภาษาที่พยายามเลียนแบบของแต่ละ บริษัท โดยใช้คำสั่งที่ใช้บ่อยที่สุดจากแต่ละ บริษัท แน่นอนพวกเขาสนับสนุนตัวย่อ (เช่นเดียวกับ VMS) หลังจากที่ได้อ่านความช่วยเหลือออนไลน์ผมพิมพ์คิดที่จะได้รับsta statusนั่นคือตัวย่อสำหรับstartและเมื่อไม่ได้ให้อะไรเลยเริ่มต้นล่ามคำสั่งจะนำฉันออก
  • X Toolkit (ใช้โดยxterm ) อนุญาตให้ใช้ตัวเลือกแบบย่อ หากต้องการใช้สิ่งนี้อย่างมีประสิทธิภาพใน xterm จะต้องทำการประมวลผลพารามิเตอร์คำสั่งล่วงหน้าเพื่อเลือก-v(สำหรับเวอร์ชั่น) เหนือ-vb(visual bell) X Toolkit ไม่มีวิธีโดยตรงในการระบุตัวเลือกที่ต้องการเมื่อมีความกำกวม

เนื่องจากศักยภาพที่คลุมเครือนี้นักพัฒนาบางคนจึงไม่อนุญาตให้ใช้ตัวย่อ Lynxเช่นใช้ตัวเลือกหลายตัวอักษรโดยไม่อนุญาตให้ใช้ตัวย่อ

ไม่ใช่ทุกโปรแกรมที่ใช้getopt: tarและpsไม่ได้ ไม่เช่นนั้นrcs(หรือsccs) อย่างที่คุณเห็นโดยการสังเกตว่าเส้นประเป็นทางเลือกและค่าตัวเลือกนั้นเป็นตัวเลือก

เมื่อคำนึงถึงสิ่งเหล่านี้แล้วนักพัฒนา GNU ได้ปรับตัวเลือกคำหลักที่ใช้ในระบบอื่น ๆ โดยการขยายgetoptเพื่อให้ตัวเลือกแบบสั้นแต่ละแบบมีความยาว ตัวอย่างเช่น textutils 1.0 changelog พูดว่า

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

การเปลี่ยนแปลงใน fileutils ก่อนหน้านี้:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

และบางคนอาจพบใครคนหนึ่งที่ยังก่อนหน้านี้ แต่ดูเหมือนว่าส่วนหัวของไฟล์จะแสดงวันที่ที่เร็วที่สุด:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

ซึ่งเป็น (ตัวอย่าง) พร้อมกันกับ X Toolkit (1987) ยูทิลิตี Unix ส่วนใหญ่ที่คุณคุ้นเคย (เช่นls, ps) ใช้ตัวเลือกอักขระเดียวที่มีอยู่ที่ต้องมีการเยี่ยมชมคู่มือเป็นระยะ เมื่อแนะนำgetopt_longนักพัฒนา GNU ไม่ได้ทำเช่นนี้โดยครั้งแรกการเพิ่มตัวเลือกใหม่ พวกเขาเริ่มต้นด้วยการทำเป็นตารางตัวเลือกที่มีอยู่และให้ตัวเลือกการจับคู่ยาว

เนื่องจากพวกเขาเพิ่มไปยังรายการเพลงที่มีอยู่มี (อีกครั้ง) ปัญหาความขัดแย้งกับตัวเลือกที่มีอยู่ เพื่อหลีกเลี่ยงปัญหานี้พวกเขาได้เปลี่ยนรูปแบบการใช้สองขีดกลางหน้าตัวเลือกยาว

โปรแกรมเหล่านี้ยังคงใช้งานgetopt_longในลักษณะนี้ด้วยเหตุผลปกติ:

  • สคริปต์ขึ้นอยู่กับตัวเลือก; นักพัฒนาไม่กังวลที่จะทำลายสคริปต์
  • มีมาตรฐานการเขียนเป็นลายลักษณ์อักษร(ซึ่งอาจมีประสิทธิภาพ)
  • ไม่มีใครคิดเครื่องมือที่แข่งขันกันซึ่งเข้ากันไม่ได้ (ทั้งนักพัฒนา BSD และ GNU คัดลอกชื่อตัวเลือกจากกันและกัน)

3

ในอินเตอร์เฟสบรรทัดคำสั่ง wikipedia มีการรายงาน:

ในระบบที่คล้าย Unix นั้นจะใช้เครื่องหมายขีดคั่น ASCII ยัติภังค์เพื่อลบตัวเลือก ตัวละครมักตามตัวอักษรอย่างน้อยหนึ่งตัว อาร์กิวเมนต์ที่เป็นยัติภังค์เดียว - ลบด้วยตัวเองโดยไม่มีตัวอักษรใด ๆ มักจะระบุว่าโปรแกรมควรจัดการข้อมูลที่มาจากอินพุตมาตรฐานหรือส่งข้อมูลไปยังเอาต์พุตมาตรฐาน มีการใช้เครื่องหมายยัติภังค์สองตัว (-) ในบางโปรแกรมเพื่อระบุ "ตัวเลือกแบบยาว" โดยใช้ชื่อตัวเลือกแบบอธิบายเพิ่มเติม นี่เป็นคุณสมบัติทั่วไปของซอฟต์แวร์ GNU


สิ่งนี้ไม่ได้ตอบคำถามว่าอนุสัญญามาจากไหนและทำไมจึงยังคงใช้ต่อไป
chharvey

1

ฉันเดาว่าต้องการตัวเลือกคำอธิบายเพิ่มเติมและตัวเลือกที่ยาวขึ้นคุณไม่ต้องกังวลเกี่ยวกับตัวเลือกอักขระเดียวที่หมด

เมื่อคุณตัดสินใจว่าคุณต้องการตัวเลือกแบบยาวคุณจะพบปัญหาอย่างน้อยถ้าคุณวางแผนที่จะสนับสนุนตัวเลือกแบบยาวและแบบสั้น ฉันไม่ได้เป็นเชิงบวก แต่ฉันเชื่อว่าคำตอบของ arcege ถือกุญแจว่าทำไมและ ขั้นตอนการประมวลผลทั่วไปเช่น getopt_long () จะต้องรู้ว่าอาร์กิวเมนต์บรรทัดคำสั่งเดียวอาจมีหลายตัวเลือกเช่น -ltr ดังนั้นขั้นตอนการประมวลผลจะต้องสามารถแยกความแตกต่างระหว่างสอง ถ้าฉันอ่านเครื่องหมายขีดกลางเดียว - ดังนั้นอาร์กิวเมนต์บรรทัดคำสั่งที่เหลือสามารถจับคู่หลาย ๆ ตัวเลือกได้ ถ้าฉันอ่านเครื่องหมายขีดกลางคู่สองตัว - แล้วอาร์กิวเมนต์บรรทัดคำสั่งที่เหลือต้องตรงกับตัวเลือกเดียว

ฉันเพิ่งใช้ประโยชน์จาก getopt_long () และฉันเริ่มชอบตัวเลือกแบบยาวเพราะพวกเขาจำได้ง่ายขึ้นและบันทึกเอกสารด้วยตนเอง หากฉันมีสองคำสั่งต่อไปนี้:

./aggregator -f 15

./aggregator - ล้างข้อมูลเวลา 15

ฉันจะบอกว่าคนที่สองที่ใช้ตัวเลือกแบบยาวนั้นอธิบายตัวเองได้มากกว่า


0

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

ที่ถูกกล่าวว่าฉันรู้ว่ามีเครื่องมือออกมีที่ใช้ยัติภังค์เดียวสำหรับตัวเลือกยาวหรือแม้กระทั่งกำจัดยัติภังค์ทั้งหมด เครื่องมือเหล่านี้อาจเป็นเรื่องยากในตอนแรกและมีแนวโน้มที่จะโผล่ออกมาเป็นหูดในระบบอื่นแบบครบวงจร

เมื่อฉันเรียนรู้ความแตกต่างระหว่างสอง (และก่อนที่มันจะกลายเป็นธรรมชาติที่สอง) ฉันมักจะจำได้ว่ายัติภังค์ "สั้น" ตรงกับตัวเลือก "สั้น" ในขณะที่ยัติภังค์ "ยาว" หรือสองเท่าตรงกับ "ยาว" ตัวเลือก. ฉันไม่รู้ว่าการใช้เหตุผลนั้นถูกใช้ในการพัฒนาสไตล์ยัติภังค์หรือไม่ แต่มันเป็นไปได้

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