เส้นประ“ -” ที่ท้ายคำสั่งหมายถึงอะไร


78

รับคำสั่งต่อไปนี้:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

อะไร-ในตอนท้ายของคำสั่งหมายถึงอะไร? มันเป็นตัวยึดบางอย่าง?


3
หนึ่งในรายละเอียดเล็ก ๆ ที่จะกล่าวถึง: -ไม่จำเป็นต้องเป็นตอนท้ายของคำสั่ง ตัวอย่างเช่นls -l | diff - /old_ls_output.txt.
จัดการ

คำตอบ:


82

ในกรณีนี้มันหมายถึง 'อินพุตมาตรฐาน' มันถูกใช้โดยซอฟต์แวร์บางตัว (เช่นtar) เมื่อต้องการอาร์กิวเมนต์ไฟล์และคุณต้องใช้ stdin แทน มันไม่ใช่โครงสร้างของเชลล์และขึ้นอยู่กับโปรแกรมที่คุณใช้ ตรวจสอบ manpage หากมีข้อสงสัย!

ในตัวอย่างนี้อินพุตมาตรฐานคืออาร์กิวเมนต์ของ-fตัวเลือก ในกรณีที่-ไม่ได้รับการสนับสนุนคุณสามารถออกไปใช้สิ่งที่ชอบtar xvf /proc/self/fd/0หรือtar xvf /dev/stdin(หลังได้รับการสนับสนุนอย่างกว้างขวางใน unices ต่างๆ)

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


4
นอกจากนี้ยังสามารถหมายถึงSTDOUTขึ้นอยู่กับบริบท
bahamat

3
และอื่น ๆ อีกมากเนื่องจากขึ้นอยู่กับแต่ละโปรแกรมที่จะตีความ
Alexios

5
/dev/stdinหรือ/dev/stdoutสามารถใช้หากคุณต้องการกระแสข้อมูลอินพุต / เอาต์พุต โปรดทราบว่ามันเป็นสตรีมโปรแกรมที่ต้องการค้นหาไฟล์อาจทำงานไม่ถูกต้องเช่นเดียวกับกรณี-(เช่น ffmpeg)
Lekensteyn

3
ในกรณีของbashเครื่องหมายยัติภังค์ถูกตีความโดยเชลล์ ดูคู่มือการใช้สคริปต์การทุบตีขั้นสูง - บทที่ 3 อักขระพิเศษจากนั้นค้นหาข้อความ [เส้นประ] หรือ "การเปลี่ยนเส้นทางจาก / ไปยัง stdin หรือ stdout" การใช้bashคุณสามารถใช้ยัติภังค์ที่สถานที่ส่วนใหญ่คาดหวังว่าชื่อไฟล์ มันเป็นส่วนประกอบที่ชัดเจนสำหรับ <| > IMHO
bsd

4
ฉันไม่เชื่อว่าเป็นอย่างนั้น ก่อนcatจัดการ-(ตรวจสอบ manpage) รุ่น shell-builtin catอาจมีหรือไม่มีก็ได้ แต่นั่นไม่ใช่ทั้งเชลล์ นอกจากนี้หากเชลล์จัดการ-คุณสามารถพูดเสียงสะท้อน-และมันจะขยายไปยังสิ่งอื่น แต่มันกลับสะท้อนเส้นประ (ไม่ใช่/dev/stdinหรือ/proc/self/fd/0) และecho test > -เพียงแค่สร้างไฟล์ที่ชื่อว่า-ดังนั้นมันจึงไม่ได้จัดการกับไฟล์นั้นอย่างชัดเจน โอ้และหน้าเว็บที่คุณอยู่ไม่ได้ระบุว่าเชลล์จัดการโดยมันบอกว่าคุณสามารถใช้กับcatและdiffทั้งสองอย่างเข้าใจเครื่องหมายขีดคั่นอย่างชัดเจน
Alexios

13

ในกรณีนี้มันใช้งาน-ไม่ได้จริง ๆ สมมติว่าคุณใช้งาน Linux:

GNU tar (รุ่นบน Linux) ยอมรับอินพุตจากอินพุตมาตรฐานตามค่าเริ่มต้น หากคุณไม่ต้องการพฤติกรรมนี้และต้องการส่งชื่อไฟล์เป็นอาร์กิวเมนต์บรรทัดคำสั่งคุณต้องระบุการตั้งค่าสถานะf:

tar xf filename

นี่คือสิ่งเดียวกัน

tar x < filename

หรือหากอินพุตถูก gzipped ดังตัวอย่างของคุณ:

gzip -dc filename | tar x

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

นอกจากนี้บรรทัดข้างต้นสามารถลดความซับซ้อนได้เนื่องจาก GNU tar สามารถบอกให้สตรีมอินพุตผ่านgzipตัวมันเองได้โดยระบุzค่าสถานะ:

tar xfz filename

- ไม่จำเป็นต้องโทรหาgzipอย่างชัดเจน


1
หมายเหตุ: ไม่ใช่ทุกคนtarมีzตัวเลือก
liori

2
OS ส่วนใหญ่ที่ไม่ใช่ Linux มีtarการเริ่มต้นเป็นเทปไดรฟ์แรกด้วยเหตุผลทางประวัติศาสตร์
Gilles

1
@Gilles และ BSD และ OS X, …. แต่ฉันอยากรู้: ระบบอื่น ๆ ยกเว้นในเมนเฟรมเก่าสองสามตัวที่ยังคงใช้เวอร์ชันดังกล่าว (ระบบอื่นนอกเหนือจากเมนเฟรมมีแม้แต่เทปไดรฟ์)
Konrad Rudolph

1
@KonradRudolph BSD หลักทั้งสามค่าเริ่มต้นเป็นเทปไดรฟ์ ( /dev/sa0บน FreeBSD 9.0 /dev/rst0บน NetBSD 6.0 และ OpenBSD 5.1) AIX 7.1 /dev/rmt0ค่าเริ่มต้น ค่าเริ่มต้น Minix3 /dev/sa0ไป (ฉันตรวจสอบเวอร์ชั่นล่าสุดของระบบปฏิบัติการในแต่ละกรณีนี่ไม่ใช่ "เมนเฟรมเก่า") Solaris สามารถกำหนดค่าผ่านไฟล์ได้/etcซึ่งฉันคิดว่าเป็นค่าเริ่มต้นสำหรับเทปไดรฟ์ GNU tar, Schilling tar, OSX และ BusyBox เริ่มต้นที่ stdin / stdout
Gilles

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