จดชวเลขเพื่อป้อนเนื้อหาของไฟล์หลาย ๆ ไฟล์ไปยัง stdin ของสคริปต์


20

สมมติว่าฉันมีสคริปต์ที่เรียกscriptว่าอ่านstdinและแยกผลลัพธ์ไปที่หน้าจอ

ถ้าฉันต้องการที่จะเลี้ยงเนื้อหาของไฟล์เดียวฉันจะพิมพ์:

$ ./script < file1.txt

แต่ถ้าฉันต้องการป้อนเนื้อหาของไฟล์หลาย ๆ ไฟล์ลงในสคริปต์ด้วยวิธีเดียวกันมันจะเป็นไปได้หรือไม่? สิ่งที่ดีที่สุดที่ฉันเคยได้รับคือ:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

ซึ่งใช้สองคำสั่งและสร้างไฟล์ชั่วคราว มีวิธีการทำสิ่งเดียวกัน แต่ข้ามการสร้างไฟล์รวม?


เปลี่ยนเป็นzshและคุณจะสามารถเรียกใช้cmd <file1 <file2 ... <fileN;)
don_crissti

คำตอบ:


20

คุณสามารถใช้catและไปป์:

cat file1 file2 file3 ... fileN | ./script

ตัวอย่างของคุณโดยใช้ไพพ์และไม่มีไฟล์ชั่วคราว:

join file1.txt file2.txt | ./script

D'โอ้ มันง่ายมากฉันไม่แน่ใจด้วยซ้ำว่าฉันไม่รู้ตัวเอง ขอบคุณ!
0x4B1D

10
การใช้ประโยชน์จากรางวัลแมว!
เกล็นแจ็คแมน

4
@ Bruce Ediger: ฉันคิดว่าคุณเพิ่งจะชี้ให้เห็นวิธีการใช้งานjoinโดยไม่ต้องใช้ไฟล์ temp แต่เพื่อให้ชัดเจนกับผู้อ่าน: cat f1 f2ไม่ได้สร้างผลลัพธ์ที่เหมือนกันjoin f1 f2
Peter.O

@ เฟรดขอบคุณที่บอกสิ่งนี้ - ฉันใช้joinในตัวอย่างเพราะฉันเคยเล่นมาก่อน catในความเป็นจริงสำหรับตัวอย่างของฉันฉันถูกใช้
0x4B1D

10

หากคุณไม่ต้องการใช้ไพพ์คุณสามารถใช้การเปลี่ยนเส้นทางอินพุตด้วยการทดแทนกระบวนการ:

./script <(cat file1 file2)

3

หากต้องการเพิ่มคำตอบของ @Jonah Braun หากคุณต้องการเพิ่มผลลัพธ์ของกระบวนการลงในสคริปต์ของคุณเช่นไฟล์ของคุณอาจไม่ได้อยู่ในดิสก์ แต่เข้าถึงได้ผ่านการURLใช้งานcurlหรือเครื่องมือที่คล้ายกัน

บางอย่างเช่นนี้สามารถใช้เพื่อรับstdoutหลายกระบวนการและใช้ในสคริปต์ผ่านstdin

นี่จะเป็นสคริปต์เพื่อจัดการเนื้อหาอินพุตของmulti-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

ตอนนี้ทดสอบ:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

เอาท์พุท:

process 1
process 2
process 3

<()เปลี่ยนกระบวนการให้เป็นเสมือนfileโดยใช้fdหากคุณต้องการดังนั้นจึง<จำเป็นต้องอ่าน catตัวมันเองไม่ต้องการเพราะมันทำในสิ่งที่มันเชื่อมไฟล์เสมือนหรือของจริง

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