รับคำสั่งต่อไปนี้:
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
.