เหตุใดจึงใช้ superflous dash (-) เพื่อส่งค่าสถานะตัวเลือกให้ tar


35

การสร้างไฟล์ tar ไดเรกทอรีให้tarคำสั่งมีcompress, verboseและfileตัวเลือกที่สามารถพิมพ์ได้ดังนี้:

$ tar -cvf my.tar my_directory/

แต่มันก็ใช้งานได้เช่นกัน:

 $ tar cvf my.tar my_directory/

นั่นคือไม่มีเส้นประ (-) นำหน้าตัวเลือก ทำไมคุณจะผ่านเส้นประ (-) ไปที่รายการตัวเลือก


ดูเพิ่มเติมที่: unix.stackexchange.com/questions/28403/tar-cvf-or-tar-cvf
unor

คำตอบ:


43

มีรูปแบบที่แตกต่างกันมากมายสำหรับตัวเลือกที่ใช้ในอดีตในแอปพลิเคชัน UNIX ตัวเก่าหลายตัวเช่นtarใช้รูปแบบตำแหน่ง:

อาร์กิวเมนต์ตัวเลือกคำสั่ง

ตัวอย่างเช่น tar ใช้

tar * something * f "ไฟล์ทำงานบนพา ธของไฟล์" * "เพื่อจัดการ" *

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

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

ใน BSD และรุ่นที่ใหม่กว่าของ unix สิ่งนี้มีการรวมกันมากขึ้นหรือน้อยลงเพื่อตั้งค่าสถานะอักขระเดี่ยวที่มีเครื่องหมาย '-' แต่สิ่งนี้เริ่มนำเสนอปัญหาสองสามประการ:

  • ธงอาจจำยาก
  • บางครั้งคุณต้องการใช้ชื่อด้วย '-'
  • และโดยเฉพาะอย่างยิ่งกับเครื่องมือของ GNU ก็เริ่มมีข้อ จำกัด ตามจำนวนธงที่เป็นไปได้ ดังนั้นเครื่องมือ GNU เพิ่มตัวเลือก GNU --outputยาวเช่น

จากนั้นซันตัดสินใจว่าส่วนเสริม '-' ซ้ำซ้อนและเริ่มใช้ธงแบบยาวด้วยตัวเดียว

และนั่นคือสิ่งที่เกิดขึ้นในขณะนี้


9
"และนกกระทาในต้นแพร์"ดีกว่าความพยายามแห้งของฉัน คุณชนะ.
dmckee

1
บริบททางประวัติศาสตร์ที่ดี

1
ผมสังเกตเห็นว่าจำนวนมากของโปรแกรม X (รวมการพูด, X จาก Xorg), -ธงการใช้งานแบบยาวมีเพียงหนึ่งเดียว มาจากดวงอาทิตย์เหรอ?
mattdm

1
อะไรคือความหมายของ 'นกกระทาในต้นแพร์'? (ฉันจะมีการเชื่อมโยงที่มีประโยชน์และง่ายต่อการทำความเข้าใจใด ๆ ?)
plhn

1
@plhn Idiom คริสต์มาสภาษาอังกฤษแบบดั้งเดิมแครอล "The Twelve Days of Christmas" แสดงรายการของขวัญฟุ่มเฟือยมากมายลงท้ายด้วย "นกกระทาในต้นแพร์" มันแนะนำรายการฟุ่มเฟือยยาว
Charlie Martin

8

คุณสามารถให้ตัวเลือก tar ในลักษณะ unix มาตรฐานtar -c -f foo -v -B file1 file2 file3ที่คุณต้องการให้เส้นประเพื่อแยกความแตกต่างระหว่างตัวเลือกและพารามิเตอร์หรือชื่อไฟล์ที่ท้ายบรรทัดคำสั่ง หรือคุณสามารถรวมตัวเลือกทั้งหมดเข้าด้วยกันในอาร์กิวเมนต์แรกซึ่งในกรณีนี้เส้นประจะเป็นตัวเลือก

จากนั้นก็มีpsที่คุณใช้ขีดคั่นถ้าคุณใช้ตัวเลือก SysV-ish และปล่อยให้พวกเขาออกถ้าคุณกำลังใช้ตัวเลือก BSD-ish เพียงเพื่อให้สิ่งที่มากขึ้นทำให้เกิดความสับสน

findและช่วยให้ไม่ได้พูดคุยเกี่ยวกับ


2

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


1
ฉันจะเพิ่มbest-practiceแท็กเพราะฉันคิดว่ามันอาจจะลงมา

1
@Milktrader เป็นคำถามที่ยากเมื่อพูดถึงแนวทางปฏิบัติที่ดีที่สุด การปฏิบัติตามอนุสัญญามาตรฐานเป็นการปฏิบัติที่ดีที่สุด แต่ไม่ว่าคุณต้องการจะทำในกรณีของคุณหรือไม่ก็ไม่ชัดเจน มันจะขึ้นอยู่กับสถานการณ์ของคุณ หากคุณกำลังแฮ็คคำสั่งอย่างรวดเร็วในเชลล์คุณอาจไม่สนใจอะไรมากนัก แต่ถ้าคุณกำลังเขียนไลบรารีสิ่งสำคัญคือต้องปฏิบัติตามอนุสัญญาที่ได้รับการยอมรับเป็นอย่างดีเพราะคุณไม่มีอำนาจควบคุมวิธีการใช้ห้องสมุดนี้ โดยลูกค้า ในกรณีนี้คุณควรครอบคลุมกรณีที่เป็นไปได้ทั้งหมดและการแยกแยะระหว่างชื่อตัวเลือกและค่าเป็นสิ่งสำคัญ

-1

มีมากถึงสี่แบบแผนเพื่อใช้ตัวเลือกบรรทัดคำสั่ง unix:

  1. -o -p -t (ขีดก่อนแต่ละตัวเลือก)
  2. -opt (เส้นประก่อนชุดตัวเลือก)
  3. opt (ไม่มีเครื่องหมายขีดกลางหน้าชุดตัวเลือก)
  4. - ตัวเลือกยาว(เส้นประคู่หน้าชื่อตัวเลือก)

ตัวอย่างเช่น:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
การประชุมนั้นใช้ได้กับน้ำมันดินหรือไม่? แล้วแอลล่ะ ls lrt ไม่ทำงาน แต่ ls -lrt / ls -l -r -t จะทำงาน ทำไมเป็นเช่นนั้น
Shashank Vyas

อนุสัญญาทั้งสี่ควรใช้ได้ผลกับทุกคำสั่ง
jonasjacek

2
ไม่พวกเขาทำไม่ได้ เมื่อวันก่อนฉันลอง rm rf <filename> ซึ่งไม่ได้ผล
Shashank Vyas

-2

ด้วยเครื่องหมายลบ / ขีดกลาง (-) ชั้นนำคุณจะต้องเก็บตัวเลือกไว้ในลำดับที่ถูกต้อง หากไม่มีการสั่งลบตัวเลือกของคุณก็สามารถเปลี่ยนได้

ตัวอย่างเช่น:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

คำตอบนี้ถูกต้องครึ่งหนึ่งแล้ว แต่ AFAIK เป็นเพียงธงเท่านั้นfที่จะโต้แย้งว่าคำสั่งนั้นสำคัญ ดูunix.stackexchange.com/a/239120/3169
Mikel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.