เครื่องหมายขีดคั่น“ -” ใน“ tar xzf -” หมายถึงอะไร?


23

เมื่อพยายามติดตั้งดรอปบ็อกซ์จากบรรทัดคำสั่งฉันอ่านคำสั่ง

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

สิ่งที่ไม่ -ได้หมายความว่าที่นี่? มันเป็นไดเรกทอรีก่อนหน้า?


9
บิตของการคุยโวโอ้อวด: f -ตัวเลือกที่คุณกำลังถามเกี่ยวกับการเป็น นี่อาจทำให้การค้นหาคำตอบในหน้าคนง่ายขึ้นเล็กน้อย
studog

4
มันจะเป็นประโยชน์จริงๆถ้าคุณสามารถอธิบายสิ่งที่แม่นยำเป็นที่ชัดเจนกับคุณเกี่ยวกับเอกสารของและwget tarด้วยวิธีนี้นักพัฒนาสามารถปรับปรุงเอกสารของพวกเขาเพื่อให้ผู้ใช้ในอนาคตไม่สะดุดปัญหาเดียวกันอีกครั้ง กล่าวอีกนัยหนึ่ง: เป็นฮีโร่และทำให้โลกนี้น่าอยู่ขึ้น!
Jörg W Mittag

2
มันจะเป็นค่าเริ่มต้นที่ดีสำหรับ tar ที่จะใช้ stdin แต่เนื่องจากเป็นมรดกคือการทำงานกับเทปจึงไม่ได้ทำเช่นนั้น แทนที่จะเรียนรู้วิธีทำงานกับไฟล์ (พร้อมตัวเลือก f) จากนั้นทำตามอนุสัญญาเพื่อให้ - แทนชื่อไฟล์สำหรับ stdin (ในกรณีที่ eXtract หรือ stdout ในกรณีสร้าง)
eckes

1
@eckes ในกรณีของ GNU tar, stdin เป็นค่าเริ่มต้นยกเว้นว่า$TAPEตั้งไว้
chrylis -on strike-

คำตอบ:


42

คำสั่งบางคำสั่งยอมรับ-แทนชื่อไฟล์เช่น:

  • หากต้องการเขียนไปยังเอาต์พุตมาตรฐานแทนไฟล์ที่มีชื่อ นี่คือสิ่งที่การ-โต้เถียงที่ส่งไปwgetหลังจาก-Oทำ
  • หากต้องการอ่านจากอินพุตมาตรฐานแทนที่จะเป็นไฟล์ที่มีชื่อ นี่คือสิ่งที่การ-โต้แย้งผ่านไปtarหลังจากxzfนั้น

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


ฉันจะพูดว่า "คำสั่งส่วนใหญ่" มากกว่า "บางคำสั่ง" ฉันเชื่อว่ามันเป็นส่วนหนึ่งของข้อกำหนดตัวเลือกไวยากรณ์ POSIX
Barmar

2
@Barmar ใช่และไม่ใช่: แนวทางที่ 13: สำหรับยูทิลิตี้ที่ใช้ตัวถูกดำเนินการเพื่อเป็นตัวแทนของไฟล์ที่จะเปิดสำหรับการอ่านหรือการเขียนควรใช้ตัวดำเนินการ '-' เพื่อหมายถึงเฉพาะอินพุตมาตรฐาน (หรือเอาต์พุตมาตรฐานเมื่อชัดเจนจากบริบท ไฟล์ที่ส่งออกจะถูกระบุไว้) หรือไฟล์ชื่อ -. ดังนั้นถ้า -เป็นตัวถูกดำเนินการสำหรับ "ตัวเลือกไฟล์" และมันมีความหมายพิเศษแล้วมันจะต้องเป็น stdin / stdout โปรแกรมนี้มีอิสระที่จะไม่ถือว่าเป็นกรณีพิเศษและเพียงแค่มองหาไฟล์-
บาคุริ

(และโดยทั่วไปในกรณีเหล่านี้จะไม่ใช้ตัวเลือกนี้เหมือนกับการใช้-)
บาคุริ

@Bakuriu ฉันไม่เห็นว่ามันจะหักล้างสิ่งที่ฉันพูด ฉันสงสัยว่าคำสั่งส่วนใหญ่ใช้อาร์กิวเมนต์ชื่อไฟล์ดังนั้นพวกเขาจึงควรปฏิบัติตามคำแนะนำนั้น แต่บางทีฉันควรจะมีคุณสมบัติเป็น "คำสั่งส่วนใหญ่ที่ทำงานกับไฟล์"
Barmar

1
@Barmar วิธีหนึ่งในการปฏิบัติตามแนวทางคือการปฏิเสธที่จะปฏิบัติ-เป็นพิเศษโดยถือเป็นชื่อไฟล์ที่แท้จริง วิธีเดียวที่จะต่อต้านแนวทางคือการปฏิบัติ-เป็นพิเศษ แต่มีความหมายอื่น ๆ กว่าแนวทางที่แนะนำ
Eliah Kagan

12

นั่นเป็นเพียงชื่อไฟล์ที่โปรแกรม Unix จำนวนมากตีความว่าเป็น "แทนที่จะเปิดไฟล์จริงอ่านจากstdin(หรือเขียนถึงstdout)"

นั่นหมายถึงการอ่านจากอินพุตที่ถูกสตรีมเข้าสู่โปรแกรม ในกรณีของคุณนั่นคือผลลัพธ์ของ wget


6
มันเป็นชื่อไฟล์จริงๆเหรอ?
Eric Duminil

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

5
@EricDuminil: โดยเฉพาะอย่างยิ่งสำหรับโปรแกรมที่เป็นไปตามการประชุมนี้คุณต้องใช้./-ถ้าคุณจริง-ต้องการที่จะเปิดไฟล์ชื่อ
Jörg W Mittag

4
@EricDuminil ในความเป็นจริง: ใช่! มันชื่อไฟล์ ; ในแง่ unix stdinเป็นตัวบ่งชี้ไฟล์และ-เป็นชื่อที่คุณจัดหาให้ใช้ ไม่ใช่ชื่อไฟล์จากมุมมองของระบบปฏิบัติการ เฉพาะจากมุมมองของผู้ใช้
Marcus Müller

3
@rexkogitans หมายเลข /dev/stdinเป็นเพียงชื่อไฟล์อำนวยความสะดวกที่มีให้โดยเคอร์เนลบางตัว มักจะไม่มี fopen("/dev/stdin", "r")อะไรเกิดขึ้นเมื่อคุณเขียนโปรแกรมที่เลือกใช้ stdin คุณเพียงแค่ไปข้างหน้าและใช้extern FILE* stdinส่วนหัว libc ของคุณให้กับคุณ; 0โดยวิธีการที่เป็นจำนวนเต็มอธิบายไฟล์
Marcus Müller

5

-อาร์กิวเมนต์tarระบุว่าข้อมูลที่เก็บควรจะอ่านจากstdinแทนของไฟล์ จากคู่มือGNU tar :

ถ้าคุณใช้-เป็นที่เก็บชื่อ , tarอ่านเก็บจากอินพุตมาตรฐาน (เมื่อรายการหรือการแยกไฟล์)

คำสั่งอื่นมีลักษณะการทำงานเหมือนกันและถูกระบุโดยมาตรฐาน POSIX.1-2017 :

คำแนะนำ 13 :

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

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