tar และตัวอักษรหลัก: มันเป็นข้อบกพร่องหรือคุณสมบัติ?


18

ฉันสงสัยว่าจะถามความแตกต่างของสองคำสั่งนี้ (เช่นคำสั่งของตัวเลือกของพวกเขาเท่านั้นที่แตกต่างกัน):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

คนแรกวิ่งได้อย่างสมบูรณ์แบบ แต่คนที่สองพูดว่า:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

และ tar ด้วย--test-labelและ-zfxvพูดว่า:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

จากนั้นฉันดูคู่มือ tar และตระหนักว่าตัวอย่างทั้งหมดที่ใช้สวิตช์-fในตอนท้าย !!

AFAICT ไม่จำเป็นต้องมีข้อ จำกัด นี้หรือมี! เพราะในมุมมองสวิตช์ของฉันควรสั่งฟรี


2
@ ค่อนข้าง "การแก้ไข" ของคุณไปยังบรรทัดคำสั่งบดบังสิ่งที่เขาพิมพ์คำสั่งจริง เส้นประนำเปลี่ยนพฤติกรรมของ GNU tar เพื่อใช้ตัวแยกวิเคราะห์อาร์กิวเมนต์ที่แตกต่างกัน การใช้ไม่มีเครื่องหมายขีดกลาง (และเป็นตัวแยกวิเคราะห์อาร์กิวเมนต์ดั้งเดิม) คำสั่งที่สองจะทำงานได้
Random832

งานพิมพ์เดลต้าจากระบบเว็บบอกฉันว่าคุณหรือใครบางคนก่อนที่จะเพิ่ม - ดังนั้นฉันลบมันอีกครั้งเพื่อให้ตรงกับสิ่งที่ระบบบอกฉันมาจาก OP แต่ถ้าคุณพูดถูกคุณจะgtar option parsingค้นพบอีกเหตุผลที่ไม่ใช้ gtar
schily

1
-fคาดว่าชื่อไฟล์จะเป็นไปตาม ในเวอร์ชันที่สองของคุณคุณระบุ-fxvซึ่ง - สำหรับ tar - หมายถึงชื่อไฟล์คือ "xv"
Rolf

1
บังคับXKCD
พาเวล

คำตอบ:


11

มองไปที่ข้อผิดพลาดของคุณก็เป็นที่ชัดเจนว่าคุณไม่ได้ใช้แต่targtar

โดยทั่วไปสิ่งนี้อาจช่วยให้เข้าใจสิ่งต่าง ๆ :

  • tarโดยปกติจะต้องมีอาร์กิวเมนต์ไฟล์ ถ้ามันหายไปมันจะอ่าน / เขียนจาก / ไปยังอุปกรณ์เทปจริงเริ่มต้นของระบบ starเปลี่ยนสิ่งนี้ในปี 1982 เพื่อใช้ stdin / stdout โดยค่าเริ่มต้นและการใช้งาน tar อื่น ๆ (เช่น gtar) ตามตัวอย่างนี้เมื่อเร็ว ๆ นี้

  • tarไม่ใช้การนำหน้า-สำหรับตัวเลือกที่ถูกเรียกใช้key lettersในกรณีของคำสั่ง tar การใช้งานบางอย่างในภายหลังถูกเพิ่ม-เป็นตัวอักษรที่ไม่ต้องใช้ตัวอักษรเพื่อความสะดวกของผู้ใช้ แต่คุณไม่สามารถเชื่อถือได้

  • วิธีtarแยกวิเคราะห์อาร์กิวเมนต์ (โดยเฉพาะอาร์กิวเมนต์ไฟล์เก็บถาวร) มีความเสี่ยงสูง ฉันได้เห็นไฟล์เก็บถาวร tar จำนวนมากที่ทำลายหนึ่งในไฟล์ที่ควรอยู่ในไฟล์เก็บถาวรเนื่องจากอาร์กิวเมนต์ไฟล์ที่เกี่ยวข้องถูกใช้เป็นไฟล์เก็บถาวร tar starด้วยเหตุผลนี้ (ถ้าเรียกว่าแบบดั้งเดิมstar) ไม่อนุญาตให้ "f" ต่อกับตัวเลือกอื่น ๆ หากstarเรียกว่าtarใช้ความเข้ากันได้ของบรรทัดคำสั่งtarแต่ยังคงจัดการอาร์กิวเมนต์สำหรับตัวอักษรคีย์ "f" แตกต่าง: อาร์กิวเมนต์จะได้รับอนุญาตเฉพาะเมื่อมันอ้างถึงไฟล์อุปกรณ์จริงหรือเมื่อ (ในโหมดการเขียน) ไฟล์ยังไม่มีอยู่ .

ผมขอแนะนำให้หลีกเลี่ยงบรรทัดคำสั่ง tar starมีความเสี่ยงค่อนข้างเดิมและใช้ไวยากรณ์บรรทัดคำสั่งที่ปลอดภัยที่ทันสมัยที่คุณได้รับ

เนื่องจากไวยากรณ์บรรทัดคำสั่งที่เป็นปัญหาของtarมีจึงเรียกว่าtar warsในช่วงต้นปี 1990 เป็นผลให้โปรแกรมpax(ละตินสำหรับ "สันติภาพ" ในสงครามทาร์) ถูกสร้างขึ้นและเป็นมาตรฐาน paxอย่างไรก็ตามไม่ได้รับความนิยมเนื่องจากไวยากรณ์มีความเสี่ยงน้อยกว่า แต่ยังใช้งานง่ายกว่าไวยากรณ์ tar ปัญหาอื่นอาจเป็นได้ว่าgpaxมากหรือน้อย unmaintained


3
สงครามน้ำมันดินสิ้นสุดลงแล้ว เทอร์ชนะแล้ว
Joshua

2
หากคุณพูดถูกทำไมการใช้งาน tar ทั้งหมดคัดลอกคุณสมบัติจากstar?
schily

1
BTW: สงครามน้ำมันดินที่ได้รับการต่อสู้ระหว่างและtar cpio
schily

2
ตกลงดังนั้นดูเหมือนว่าstar's -f"$file"ยังเป็น (นอกเหนือไปind) =มีปัญหากับชื่อไฟล์ที่เริ่มต้นด้วย ดังนั้นหนึ่งในความต้องการที่จะเขียนมันอย่างใดอย่างหนึ่งหรือ-f="$file" -f "$file"ฉันไม่แน่ใจว่าฉันจะเรียกตัวเลือกดาวของคุณแยกวิเคราะห์ปลอดภัยหรือทันสมัยกว่านี้
Stéphane Chazelas

3
-longรูปแบบตัวเลือกที่มีความยาวไม่เข้ากันกับย่อตัวเลือกสั้นหรือ-xyz -xargนั่นเป็นเหตุผลที่ตัวเลือกแบบยาวของ X11 ต้องการตัวเลือกสั้น ๆ ที่จะแยก ( -x -yไม่ใช่-xy) และอาร์กิวเมนต์ของตัวเลือกให้อยู่ในอาร์กิวเมนต์ที่แยกต่างหาก ( xterm -n fooไม่ใช่xterm -nfoo) และนั่นเป็นเหตุผลที่ว่าทำไมตัวเลือกแบบยาวของ GNU จึงเพิ่มความสับสนให้กับตัวเลือกแบบสั้นและทำไมตัวเลือกแบบยาวของ GNU จึงเป็นแบบที่ดีกว่า คุณสามารถ-fooอยู่ร่วมกันได้-x -y -xyเฉพาะในกรณีที่คุณระมัดระวังในการหลีกเลี่ยงการทับซ้อน
Stéphane Chazelas

55

ลำดับของสวิตช์ฟรี แต่-fมีอาร์กิวเมนต์ที่จำเป็นซึ่งเป็นไฟล์ที่tarจะอ่าน / เขียน

คุณสามารถทำได้

tar -zf foo.tar.gz -xv

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

นี่คือวิธีที่คำสั่งทั้งหมดที่มีตัวเลือกที่มีอาร์กิวเมนต์ทำงาน


5
Tar ไม่ทำงานเหมือนคำสั่งอื่นเนื่องจากใช้ตัวแยกวิเคราะห์บรรทัดคำสั่งเก่ากว่าซึ่งต่างจากเดิมที่ใช้ในคำสั่ง "ar" และคำสั่ง old (pre-POSIX) "ps"
schily

1
ขอบคุณสำหรับคำตอบที่เลือกในขณะที่ละเอียดไม่ได้ช่วยให้ฉันเห็นว่าปัญหาคืออะไร ในการหวนกลับดูเหมือนว่าเห็นได้ชัดจากข้อผิดพลาดที่ระบุ tar พยายามที่จะอ่านไฟล์ 'xv'
Josh Rumbut

1
ฉันเชื่อว่าคุณยังสามารถประกาศได้-f=./myfileว่านั่นคือ f รับค่ามันไม่ใช่แฟล็กมันคืออินพุต
ThorSummoner

14

ตามเนื้อผ้าตัวเลือกของ tar จะมากหรือน้อย "ไม่มีคำสั่งซื้อ" (ลำดับของตัวเลือกfและbตัวเลือกมีความสำคัญหากระบุไว้ทั้งคู่) อย่างไรก็ตามการใช้เส้นประนำทำให้ GNU tar แยกวิเคราะห์ตัวเลือกในลักษณะที่ถือว่าสอดคล้องกับคำสั่งอื่นมากขึ้นโดยการระบุตัวเลือกที่ต้องการอาร์กิวเมนต์ (เช่นชื่อไฟล์f) จะใช้ส่วนที่เหลือของ "คำ" ในทันที ถ้าเป็นอาร์กิวเมนต์ (ตามธรรมเนียมแล้ว tar จะใช้คำถัดไปเป็นชื่อไฟล์ / ขนาดบล็อกเมื่อมีการระบุfหรือb) ในกรณีของคุณมันใช้ "xv" เป็นชื่อไฟล์

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

นี้ถูกบันทึกไว้ในกลาส่วน Manual "รูปแบบสามตัวเลือก" การใช้งานอื่น ๆ บางอย่าง (เช่น FreeBSD) อ้างถึงตัวเลือกรูปแบบเก่าว่าเป็น "คำตัวเลือกที่รวมมา" และแน่นอนว่าการใช้งานบางอย่างอาจสนับสนุนตัวเลือกประเภทนี้เท่านั้นและอาจหรืออาจไม่สนใจขีดกลางหากรวมอยู่ด้วย นี่เป็นรูปแบบเดียวของการเรียกใช้ที่ระบุไว้ในข้อมูลจำเพาะของ Unix เดี่ยวดังนั้นจึงรับประกันได้ว่าจะสามารถทำงานได้กับเกือบทุกระบบ


2
โปรดทราบว่าการใช้งานบางอย่างสนับสนุนตัวเลือกอื่น ๆ ที่มีข้อโต้แย้ง (เช่นCใน BSD หรือ GNU tar. schily tar รองรับเป็น -C แต่ไม่เป็น C, ทั้งหมดสนับสนุนเป็น -C)
Stéphane Chazelas

0

ใน tar, สวิตช์- in ถูกเลิกใช้มาหลายปีแล้วและไม่จำเป็นอีกต่อไป ทาร์จริงเคยบอกคุณว่า แต่ไม่ได้อีกต่อไป

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

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