รับคำสั่งต่อไปนี้:
gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf –
อะไร-ในตอนท้ายของคำสั่งหมายถึงอะไร? มันเป็นตัวยึดบางอย่าง?
รับคำสั่งต่อไปนี้:
gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf –
อะไร-ในตอนท้ายของคำสั่งหมายถึงอะไร? มันเป็นตัวยึดบางอย่าง?
คำตอบ:
ในกรณีนี้มันหมายถึง 'อินพุตมาตรฐาน' มันถูกใช้โดยซอฟต์แวร์บางตัว (เช่นtar) เมื่อต้องการอาร์กิวเมนต์ไฟล์และคุณต้องใช้ stdin แทน มันไม่ใช่โครงสร้างของเชลล์และขึ้นอยู่กับโปรแกรมที่คุณใช้ ตรวจสอบ manpage หากมีข้อสงสัย!
ในตัวอย่างนี้อินพุตมาตรฐานคืออาร์กิวเมนต์ของ-fตัวเลือก ในกรณีที่-ไม่ได้รับการสนับสนุนคุณสามารถออกไปใช้สิ่งที่ชอบtar xvf /proc/self/fd/0หรือtar xvf /dev/stdin(หลังได้รับการสนับสนุนอย่างกว้างขวางใน unices ต่างๆ)
อย่าพึ่งพาสิ่งนี้เพื่อหมายถึง 'อินพุตมาตรฐาน' ในระดับสากล เนื่องจากเชลล์ไม่ถูกตีความโดยทุกโปรแกรมมีอิสระที่จะจัดการกับมันตามที่ต้องการ ในบางกรณีมันเป็นเอาท์พุทมาตรฐานหรือสิ่งที่แตกต่างอย่างสิ้นเชิง: suมันหมายถึง 'เริ่มเปลือกเข้าสู่ระบบ' ในกรณีอื่น ๆ มันไม่ได้ตีความเลย หน่วยความจำของกล้ามเนื้อทำให้ฉันสร้างไฟล์ค่อนข้างน้อย-เพราะมีบางเวอร์ชันของโปรแกรมบางตัวที่ฉันไม่คุ้นเคยกับเส้นประ
STDOUTขึ้นอยู่กับบริบท
/dev/stdinหรือ/dev/stdoutสามารถใช้หากคุณต้องการกระแสข้อมูลอินพุต / เอาต์พุต โปรดทราบว่ามันเป็นสตรีมโปรแกรมที่ต้องการค้นหาไฟล์อาจทำงานไม่ถูกต้องเช่นเดียวกับกรณี-(เช่น ffmpeg)
bashเครื่องหมายยัติภังค์ถูกตีความโดยเชลล์ ดูคู่มือการใช้สคริปต์การทุบตีขั้นสูง - บทที่ 3 อักขระพิเศษจากนั้นค้นหาข้อความ [เส้นประ] หรือ "การเปลี่ยนเส้นทางจาก / ไปยัง stdin หรือ stdout" การใช้bashคุณสามารถใช้ยัติภังค์ที่สถานที่ส่วนใหญ่คาดหวังว่าชื่อไฟล์ มันเป็นส่วนประกอบที่ชัดเจนสำหรับ <| > IMHO
catจัดการ-(ตรวจสอบ manpage) รุ่น shell-builtin catอาจมีหรือไม่มีก็ได้ แต่นั่นไม่ใช่ทั้งเชลล์ นอกจากนี้หากเชลล์จัดการ-คุณสามารถพูดเสียงสะท้อน-และมันจะขยายไปยังสิ่งอื่น แต่มันกลับสะท้อนเส้นประ (ไม่ใช่/dev/stdinหรือ/proc/self/fd/0) และecho test > -เพียงแค่สร้างไฟล์ที่ชื่อว่า-ดังนั้นมันจึงไม่ได้จัดการกับไฟล์นั้นอย่างชัดเจน โอ้และหน้าเว็บที่คุณอยู่ไม่ได้ระบุว่าเชลล์จัดการโดยมันบอกว่าคุณสามารถใช้กับcatและdiffทั้งสองอย่างเข้าใจเครื่องหมายขีดคั่นอย่างชัดเจน
ในกรณีนี้มันใช้งาน-ไม่ได้จริง ๆ สมมติว่าคุณใช้งาน 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อย่างชัดเจน
tarมีzตัวเลือก
tarการเริ่มต้นเป็นเทปไดรฟ์แรกด้วยเหตุผลทางประวัติศาสตร์
/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
tarที่จะเริ่มต้นกับสองเทปไดรฟ์สำหรับเหตุผลที่ชัดเจน :)
-ไม่จำเป็นต้องเป็นตอนท้ายของคำสั่ง ตัวอย่างเช่นls -l | diff - /old_ls_output.txt.