ความแตกต่างระหว่างเส้นประหนึ่งและสองขีดกลางสำหรับพารามิเตอร์พรอมต์คำสั่งคืออะไร


65

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

ตัวอย่างโปรแกรมส่วนใหญ่มีลักษณะดังนี้: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

ในขณะที่บางโปรแกรมมีลักษณะดังนี้: xmllint --valid toc.xml --noout

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


10
> มันไม่สมเหตุสมผลสำหรับทุกคนที่จะยึดติดอยู่กับมาตรฐานเดียวใช่ โปรแกรมเมอร์ทุกคนปฏิบัติตามมาตรฐานและมีความมั่นคงหรือไม่? เลขที่โปรแกรมเมอร์จำนวนมากไม่สามารถแม้แต่จะรักษาความมั่นคงภายในของพวกเขาโปรแกรม :) ที่ถูกกล่าวว่ามติจะใช้อย่างใดอย่างหนึ่งเท่านั้นรีบหาตัวเลือกหนึ่งตัวอักษรและสองขีดกลางสำหรับทุกสิ่งที่เป็นจริงคำพูดเช่น-iกับหรือ--input -n --dry-run
slhck

1
@slhck เฮ้ขอบคุณสำหรับความช่วยเหลือ =) จากการประชุมนั้นหมายความว่า-dtdควรจะเป็นจริง--dtdหรือ? สิ่งที่ฉันสงสัยอย่างมีประสิทธิภาพคือสิ่งที่เส้นประ (และเส้นประสองเส้น) พยายามหมายถึงอะไร
Pacerier

6
สำหรับคะแนนโบนัส: โปรแกรมที่สอดคล้องกับมาตรฐาน Gnu สำหรับ--long-optionsจะยอมรับตัวย่อที่ไม่เหมือนใครเช่นกัน ดังนั้นสำหรับโปรแกรมที่มีตัวเลือก--file-inและ--file-outคุณสามารถใช้--file-o=fooหรือซึ่งสามารถบันทึกการพิมพ์บางอย่างสำหรับ--file-i=foo --very-long-optional-parameters
BRPocock

GNU พร้อมมาพร้อมกับการประชุมของพวกเขาโดยใช้สองขีดกลางสำหรับตัวเลือก "ยาว" ซึ่งผมก็จะชอบ แต่สาธารณูปโภคเก่าจำนวนมากเช่นผู้ที่มาพร้อมกับระบบวินโดว์เช่นเดียวกับ ImageMagick ( เช่น , convert, mogrify) มี "ยาว" ตัวเลือกที่ใช้เพียงเส้นประเดียว ตัวอย่างเช่นxterm -fn 6x10 -geometry 80x24+30+200. ตัวย่อที่ได้รับการสนับสนุนให้พวกเขากำลังที่แตกต่างกัน ( เช่น , -gหรือ-geomสำหรับ-geometry) ดูX (7)สำหรับตัวอย่างอื่น
TheDudeAbides

คำตอบ:


18

เพียงทำls --help และดูตัวเลือก; ควรชัดเจนกับคุณ

มันไม่มีส่วนเกี่ยวข้องกับพารามิเตอร์เลย ตัวเลือกมากมายมีรูปแบบย่อและแบบยาวและหลายตัวเลือกมีหนึ่งแบบและไม่ใช่แบบอื่น

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

นี่คือสารสกัดจากls --help( man lsให้ข้อมูลที่เทียบเท่า) แจ้งให้ทราบว่าบางคนมีรูปแบบนานโดยไม่ต้องเป็นรูปแบบสั้น ๆ ( --author, --block-size) บางคนมีแบบฟอร์มสั้น ๆ โดยไม่ต้องมีแบบยาว ( -c, -f, -g) และบางส่วนมีทั้งแบบยาวและแบบสั้น (ที่-A/ --almost-all, -b/ --escape)

 -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 ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

4
เราจะทำls --helpบน windows ได้อย่างไร
Pacerier

1
@Pacerier ไม่มีlsWindows dir /?คำสั่งจะเทียบเท่า คุณกำลังใช้ซอฟต์แวร์ข้ามแพลตฟอร์มที่ละเมิดอนุสัญญา Windows ทั่วไปดูคำตอบของฉัน
Daniel Beck

@Pacerier มันไม่ได้อยู่ในตัว แต่ให้ดาวน์โหลดโดยบุคคลที่สาม Gnuwin32 ที่คุณดาวน์โหลด (google gnuwin32) มีกลุ่มของแพ็กเกจภายใน gnuwin32 แต่ละคำสั่งดาวน์โหลดแพ็คเกจ coreutils ที่มีคำสั่งทั่วไปมากมาย
barlop

มีตัวเลือกแบบยาวโดยไม่มีตัวเลือกสั้น ๆ ในls --helpข้อความที่ตัดตอนมาของคุณ ดูและ--author --block-size
ด่าน

ที่จะตอบคำถามใน @ Pacerier ของความคิดเห็นเดิม: วิธีที่พบมากที่สุดระบบที่ใช้ Windows ที่ทันสมัยได้รับlsคำสั่งผ่านทางGIT เปลือก GIT ทุบตีหรือหน้าต่าง CMD มีถังเก็บ GIT lsในเส้นทางจะมี
yzorg

34

ไม่มีมาตรฐานที่แพร่หลาย มีความสอดคล้องเช่นในโปรแกรม GNU แต่คุณต้องตรวจสอบเอกสารของแต่ละโปรแกรม

อ้างถึงวิกิพีเดียโดยเน้นที่เหมือง:

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

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


คุณมักจะพบอาร์กิวเมนต์เดียวกันมีทั้งตัวเลือกเป็นสั้นและระยะยาวเป็นเช่นในคำสั่ง ls

บางโปรแกรมใช้ยัติภังค์เดียวสำหรับตัวเลือกหนึ่งตัวและยัติภังค์สองตัวสำหรับตัวเลือกหลายตัวอักษร แต่ไม่ใช่ทั้งหมด (GNU findคำนึงถึง) บางโปรแกรมมียัติภังค์ที่เป็นทางเลือกหรือข้ามไปด้วยกัน ( tarหรือ BSD psเข้ามาในใจ)

บางครั้งตัวเลือกแบบยาว ( --foo) จำเป็นต้องมีอาร์กิวเมนต์ในขณะที่ตัวเลือกแบบสั้น ( -f) ไม่ (หรืออย่างน้อยก็หมายถึงอาร์กิวเมนต์เริ่มต้นเฉพาะ)

ตัวเลือกสั้น ๆ (เช่นcut -d ' ') สามารถมีอาร์กิวเมนต์ในขณะที่ตัวเลือกยาว (เช่นls --all) ไม่จำเป็นต้องมี

ในการตั้งค่าลักษณะการทำงานเฉพาะของโปรแกรมบางครั้งคุณต้องใช้ตัวเลือกสั้น ๆ สำหรับคนอื่นที่คุณต้องใช้ตัวเลือกที่ยาวและสำหรับบางคนที่คุณมีทางเลือก

ในบันทึกที่เกี่ยวข้องบางโปรแกรมไม่สามารถจัดการช่องว่างระหว่างตัวเลือกและอาร์กิวเมนต์ในขณะที่โปรแกรมอื่นไม่สามารถทำได้

อย่างที่ฉันเขียนในตอนแรกไม่มีเพียงแค่พฤติกรรมหรือมาตรฐานทั่วไป บ่อยครั้งที่คุณสามารถติดตามพฤติกรรมที่คล้ายกันในไลบรารีเดียวกันที่ใช้สำหรับการแยกวิเคราะห์อาร์กิวเมนต์ แต่คุณอาจไม่ต้องการอ่านแหล่งข้อมูลเพื่อค้นหาสิ่งนี้

คุณไม่สามารถอนุมานไวยากรณ์อาร์กิวเมนต์ของโปรแกรมหนึ่งจากอีกโปรแกรมได้


หากคุณพิจารณา Windows ด้วยก็จะยิ่งแย่ลง: ในขณะที่บรรทัดคำสั่งของ Windows เรียกใช้ตามปกติ/f(อย่างน้อยที่สุดตัวอักษรเดียว) สำหรับตัวเลือกโดยมี:ตัวคั่นระหว่างตัวเลือกและค่า (ดูเช่นที่นี่ ) ยูทิลิตี้ข้ามแพลตฟอร์มนั้นแพร่หลาย (เช่นที่คุณพูดถึง) และนำมาพร้อมกับเครื่องหมายยัติภังค์ทั่วไปสำหรับข้อโต้แย้งโดยมีความไม่สอดคล้องกันทั้งหมดที่กล่าวถึงข้างต้น


2
มันควรจะตั้งข้อสังเกตว่าห้องสมุดมาตรฐาน GNU ให้การทำงานของการทำแผนที่หนึ่งลบหนึ่งตัวอักษรตัวเลือกสองลบหลายตัวอักษรเพื่อให้ทุกโปรแกรม GNU ใหม่และมากที่สุดซอฟแวร์ใหม่ฟรีทั่วไปใช้เครื่องหมายนี้ (เช่น - f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks เช่นtar, ps, findและเช่นมีไวยากรณ์บรรทัดคำสั่งของพวกเขาที่กำหนดโดย POSIX ก่อนที่มาตรฐานนี้ได้เป็นกาวอย่างสมบูรณ์ ในระบบ Gnu / Linux มันเป็นทางออกที่ปลอดภัยพอสมควรที่--helpจะสนับสนุนอย่างน้อย(เกือบ) ตลอดจนman <command>หรือinfo <command>
BRPocock

มาตรฐานของ GNU บอกว่าคุณไม่ควรมีแบบสั้นโดยไม่มีแบบยาวและไม่ควรมีความยาวโดยไม่มีแบบย่อ
barlop

+1 สำหรับคำตอบที่สมบูรณ์ที่สุดรวมถึงการกล่าวถึง GNU findซึ่งไม่เป็นไปตาม "การประชุม GNU" สำหรับตัวเลือกที่ยาวนาน (อาจเป็นเพราะเหตุผลของการปฏิบัติตาม POSIX ตามที่ @BRPocock ชี้ให้เห็น) ฉันจะ +1 อีกครั้งถ้าทำได้ถ้าพูดถึงสวิตช์ "DOS" ของบรรทัดคำสั่ง DOS / Windows เนื่องจากคำถามของ OP ถูกติดแท็ก "windows" และการประชุมนั้นควรถูกกล่าวถึงอย่างครบถ้วน
TheDudeAbides

7

นี่คือการประชุมที่มาจาก * ระวัง ยัติภังค์ดับเบิลแจ๋วตัวเลือกเมื่อพวกเขาจะเขียนเต็ม , ในขณะที่ยัติภังค์เดียวนำหน้าตัวเลือกเมื่อพวกเขาจะเขียนในรูปแบบสั้น ยกตัวอย่างเช่นสามารถลงไปls --all --l ls -alเท่าที่เห็นไม่มีตัวเลือกทั้งหมดที่มีตัวอักษรเดียวของพวกเขาเทียบเท่าแม้ว่าตัวที่ใช้มากขึ้นมักจะทำ

ไม่ว่าจะเป็นตัวเลือกที่จะโต้แย้งไม่ได้สร้างความแตกต่างจริงๆ - มันสามารถนำพวกเขาหรือไม่ใช้พวกเขาโดยไม่คำนึงถึงวิธีที่คุณป้อนตัวเลือก

เมื่อเขียนพวกเขาสำหรับการใช้งานครั้งเดียวมันไม่สำคัญ แต่เมื่อเขียนคำสั่งเช่นในไฟล์. alias มันเป็นประเพณีที่จะใช้แบบเต็มรูปแบบ เพียงเพื่อความสะดวกในการอ่านสำหรับคนต่อไป


เฮ้ขอบคุณสำหรับความช่วยเหลือ Btw มีเหตุผลที่คุณพิมพ์ unix เป็น * ระวังหรือไม่
Pacerier

2
@Pacerier - Unix เป็นชื่อทางการค้า โดยการพิมพ์ * ระวังฉันหมายถึงระบบปฏิบัติการยูนิกซ์และระบบที่คล้ายคลึงกันทั้งหมดซึ่งในทางปฏิบัติทั้งหมดนั้นเหมือนกัน แต่ส่วนใหญ่ก็เป็นแรงนิสัย ...
โกง

2
@Pacerier * ระวังสามารถอ้างถึง Linux หรือ Unix ฉันไม่แน่ใจโดยสิ้นเชิงเกี่ยวกับเรื่องนี้เพราะเมื่อไม่นานมานี้ฉันก็มองเข้าไป แต่ในทางเทคนิคแล้วถ้าฉันจำได้ BSD มาจากตระกูล Unix ลินุกซ์ในทางเทคนิคไม่ใช่ .. และไม่มี FreeBSD แต่การบอกว่า * ระวังจะรวม unix / bsd และอะไรทำนองนั้นเช่น linux และ freebsd
barlop

2
+1 สำหรับการกล่าวถึงการรวมคำสั่งชวเลข นั่นคือเหตุผลที่แท้จริงว่าทำไมมีสองสไตล์
Ryan_S

3

สิ่งเหล่านี้เป็นไวยากรณ์ UNIX ทั่วไป

อาร์กิวเมนต์ของโปรแกรมใช้เครื่องหมายยัติภังค์หนึ่งตัว ("-") ตามด้วยตัวอักษรตัวเดียวเมื่อเป็นตัวเลือกที่ง่าย (เช่น: -v ) และยัติภังค์สองตัว ("-") เมื่อตัวเลือกนั้นใช้อาร์กิวเมนต์ (เช่น: --file toc.xmlหรือ--file = toc.xml )

ไม่มีผลกระทบต่อการทำงานของโปรแกรม


3
นอกจากนี้ในหลาย ๆ กรณีที่มีตัวเลือกตัวอักษรตัวเดียวต่อจากเส้นประเดียวคุณสามารถจัดกลุ่มตัวอักษรเข้าด้วยกัน ตัวอย่างเช่น "ls -al" เหมือนกับ "ls -a -l" ไม่สามารถรวมตัวเลือก Double-dash ด้วยวิธีนี้ ตัวเลือกตัวอักษรตัวเดียวเป็นมาตรฐานที่เก่ากว่า แต่ทุกวันนี้คำสั่งจำนวนมากจะใช้ทั้งสองประเภท เช่น "ls - all" เหมือนกับ "ls -a"
แรนดี้ออร์ริสัน

3
ที่จริงแล้วการแก้ไขอื่น ตัวเลือกตัวอักษรเดียวแบบขีดเดียวสามารถใช้พารามิเตอร์ได้ แต่โดยทั่วไปจะไม่เชื่อมโยงกับเครื่องหมายเท่ากับ ตัวอย่างเช่น "tail -n 50" แสดง 50 บรรทัดสุดท้ายของไฟล์ซึ่งเทียบเท่ากับ "tail --lines = 50"
Randy Orrison

ตามอนุสัญญานี้หมายความว่า--nooutควรเขียน (ในคำถามข้างต้น) จริง ๆ-nooutเนื่องจากไม่มีข้อโต้แย้งหรือไม่?
Pacerier

1
สิ่งที่ได้กล่าวไว้ในคำตอบเกี่ยวกับพารามิเตอร์นั้นผิดทั้งหมด ประโยคแรกชัดเจน ประโยคสุดท้ายชัดเจน และย่อหน้าที่อยู่ตรงกลางที่ควรตอบคำถามนั้นผิดทั้งหมด
barlop

@RealOrrison เมื่อตัวอักษรตัวเดียวฉันไม่เคยเห็นเครื่องหมายเท่ากับ .. และเพื่ออธิบายในจุดของคุณพวกเขามักจะใช้พารามิเตอร์ .. wget -w 10 หัว -n 3 ตัด -b 2 และดูปิง -? !! โหลดรับพารามิเตอร์ คำตอบนี้น่ากลัวมาก
barlop

3

รีบเดียวจะดำเนินการโดยgetoptและมีฟังก์ชั่นมาตรฐาน POSIX ประคู่ในgetopt_longและเป็นมาตรฐาน GNU

ตามเนื้อผ้าเส้นประเดียวให้ตัวเลือกอักขระเดียวเช่นนี้

- หรือ -V เป็นต้น แต่ไม่จำเป็นต้อง จำกัด เช่น -Wall สำหรับ gcc เปิดการเตือนคอมไพเลอร์ทั้งหมดสำหรับคำสั่ง gcc compiler

อาร์กิวเมนต์เส้นประสองครั้งมีแนวโน้มที่จะ verbose มากขึ้นและมักจะใช้พารามิเตอร์ที่ให้มาเช่น --max-count = NUM อย่างไรก็ตาม - รุ่นใช้ไม่เท่ากับ

โดยทั่วไปแล้วจะไม่มีกฎเกณฑ์หรือมาตรฐานที่กำหนดว่าควรระบุข้อโต้แย้งของโปรแกรมเพียงใด อย่างไรก็ตามหากใช้ฟังก์ชันการแยกวิเคราะห์บรรทัดคำสั่ง getopt และ getopt_long ดังนั้นพารามิเตอร์ควรเป็นไปตามมาตรฐานเนื่องจากฟังก์ชันไลบรารีบังคับใช้วิธีการที่แน่นอน

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