ความแตกต่างระหว่างเครื่องหมายขีดกลางเดี่ยวและเครื่องหมายขีดกลางสองคู่บนคำสั่งเชลล์คืออะไร


70

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


มันควรจะถูกควบคุมโดยมาตรฐาน POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc

ลิงค์นั้นคือตอนนี้ 404 @cjc :( ลิงก์ที่น่าเชื่อถือกว่าอาจเป็นen.wikipedia.org/wiki/POSIX
Bernhard Hofmann

ลิงค์ที่ดีกว่า: en.wikipedia.org/wiki/…
Craig Fisher

คำตอบ:


110

ยัติภังค์เดียวสามารถตามด้วยธงเดี่ยวอักขระหลายตัว ยัติภังค์คู่นำหน้าตัวเลือกหลายตัวเดียว

ลองพิจารณาตัวอย่างนี้:

tar -czf

ในตัวอย่างนี้-czfระบุสามธงตัวเดียว: c, และ zf

ลองพิจารณาอีกตัวอย่างหนึ่ง:

tar --exclude

ในกรณีนี้--excludeระบุชื่อตัวเลือกหลายตัวเลือกexcludeเดียว ยัติภังค์คู่ disambiguates อาร์กิวเมนต์บรรทัดคำสั่งเพื่อให้มั่นใจว่าtarตีความมันเป็นexcludeมากกว่าการรวมกันของe, x, c, l, u, และde


1
@ kylex ไม่เนื่องจากไม่มีตัวเลือกแบบยาวชื่อเพียง "c" และ - หมายถึงตัวเลือกแบบยาวไม่ใช่ตัวเลือกอักขระเดียวดังต่อไปนี้
psusi

13
บางครั้งแม้แต่คำสั่งที่ยาวสามารถเป็นเส้นประเดียว ตัวอย่างเช่น 'cdrecord' ใช้คำสั่งแบบประเดียวทั้งหมด (-eject -dao ... ) ทุกอย่างขึ้นอยู่กับโปรแกรม แต่ส่วนใหญ่ (!) ของพวกเขาใช้ - สำหรับคำสั่งเดียวและ - สำหรับคำสั่งหลายตัวละคร (ยาว)
mulaz

8
@ulaz, ใช่ cdrecord ทำสิ่งที่โง่ ๆ
psusi

10
โปรดจำไว้ว่า - การใช้ด้วยตัวเองมักจะบ่งบอกถึงตัวเลือกสุดท้าย ดูที่นี่สำหรับข้อมูลเพิ่มเติม: unix.stackexchange.com/questions/11376/…
Sirex

3
@ killjoy เพราะไม่ว่าจะด้วยความไม่รู้หรือทางเลือกผู้เขียนโปรแกรมเหล่านั้นไม่ได้ทำตามแบบแผนของหลักสูตร เช่นเดียวกับcdrecordปีที่ผ่านมากล่าวถึงในความคิดเห็นข้างต้น
psusi

17

ทุกอย่างขึ้นอยู่กับโปรแกรม โดยปกติ "-" ใช้สำหรับตัวเลือก 'สั้น' (หนึ่งตัวอักษร, -h) และ "-" ใช้สำหรับตัวเลือก "ยาว" (เอ้อ) (- ช่วย)

โดยปกติแล้วตัวเลือกสั้น ๆ สามารถรวมกันได้ (ดังนั้น "-h -a" จึงเหมือนกับ "-ha")

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

แหล่ง


2
แล้วทำไมมันถึง java -version และ ant -version ล่ะ?
killjoy

7

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

มันเป็นสิ่งที่ดีสำหรับเราสามารถมีตัวเลือกหลายสั้นรวมกันเป็นคำตอบอื่น ๆ tar -xzf myfile.tar.gzบอกว่าชอบ

ถ้ามี "ลิซ่า" อาร์กิวเมนต์สำหรับการlsมีอาจจะมีความหมายที่แตกต่างกันในการพิมพ์มากกว่าls -lisa ls --lisaอดีตเป็นl, i, sและaพารามิเตอร์ไม่คำว่า

ในความเป็นจริงคุณสามารถเขียนls -l -i -s -aความหมายเหมือนกันls -lisaแต่นั่นจะขึ้นอยู่กับโปรแกรม

นอกจากนี้ยังมีโปรแกรมที่ไม่ปฏิบัติตามอนุสัญญานี้ ที่สะดุดตาที่สุดสำหรับฉันddและgcc.


3

ตัวเลือกแบบสั้นพร้อมตัวเลือกแบบยาวและแบบตัวยาว

ตัวเลือกสั้นสามารถรวมกันเป็นอาร์กิวเมนต์เดียว;

for example: ls -lrt #instead of ls -l -r -t

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

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