ส่งผ่านไพพ์ไปยังคำสั่งที่ต้องการชื่อไฟล์


19

ว่าฉันมีคำสั่งfooที่ใช้อาร์กิวเมนต์ชื่อไฟล์: foo myfile.txt. น่ารำคาญfooไม่อ่านจากอินพุตมาตรฐาน แทนที่จะเป็นไฟล์จริงฉันต้องการส่งผ่านผลลัพธ์ของคำสั่งอื่น (ในความเป็นจริงpvซึ่งจะจับไฟล์และส่งมิเตอร์วัดความคืบหน้าเป็นผลข้างเคียง)

มีวิธีที่จะทำให้สิ่งนี้เกิดขึ้นหรือไม่? ดูเหมือนจะไม่มีอะไรในกระเป๋าของฉัน

( fooในกรณีนี้คือสคริปต์ PHP ซึ่งฉันเชื่อว่าประมวลผลไฟล์ตามลำดับ)

ฉันใช้ Ubuntu และ Bash

แก้ไขขออภัยสำหรับคำอธิบายปัญหาที่ไม่ชัดเจนเล็กน้อย แต่นี่เป็นคำตอบที่ฉันต้องการ:

pv longfile.txt | foo /dev/stdin

ชัดเจนมากตอนนี้ที่ฉันเห็นมัน


คุณกำลังมองหาหนึ่งซับ?
Dave Forgac

คุณแน่ใจหรือไม่ว่า foo ไม่ยอมรับอาร์กิวเมนต์ "-" เพื่อให้อ่านได้จาก stdin?
rackandboneman

น่าเศร้าใช่ในกรณีนี้ - มันเป็นสคริปต์ php
Steve Bennett

ใช่แล้ว .
Steve Bennett

คำตอบ:


19

ถ้าฉันเข้าใจสิ่งที่คุณต้องการทำอย่างถูกต้องคุณสามารถทำได้ด้วยคุณสมบัติการแทนที่คำสั่งของ bash:

foo <(somecommand | pv)

สิ่งนี้คล้ายกับสิ่งที่mkfifoคำตอบที่ใช้แนะนำยกเว้นว่าทุบตีจัดการรายละเอียดสำหรับคุณ (และมันจะส่งผ่านสิ่งที่ต้องการ / dev / fd / 63 ไปยังคำสั่งแทนที่จะเป็นไปป์ปกติที่มีชื่อ) คุณอาจทำได้โดยตรงเช่นนี้มากขึ้น:

somecommand | pv | foo /dev/stdin

1
โอ้ดีจัง! นี่pv inputfile.txt | foo /dev/stdinคือสิ่งที่ฉันกำลังมองหา แต่ไม่ได้คิด
Steve Bennett

Woot! / dev / stdin
ปราชญ์

<(.)ทำงานให้ฉัน ไวยากรณ์นี้เป็นเอกสารในคู่มือ Bash หรือไม่ ฉันเข้าใจ(.)ว่ามีการบันทึกคำสั่งทดแทน แต่ไม่เห็นการรวมคำ<อธิบาย
flow2k

@ flow2k มันเรียกว่า "กระบวนการทดแทน" - ดูส่วน 3.5.6 ของคู่มือทุบตี
Gordon Davisson

เข้าใจแล้ว คุณขวา - มันกล่าวว่าจะใช้ชื่อmkfifo/ ท่อ
flow2k


2

คำถาม Unix SE นี้มีคำตอบที่แสดงวิธีสร้างไพพ์ที่มีชื่อชั่วคราว:

Shell Script mktemp วิธีที่ดีที่สุดในการสร้าง pipe ที่มีชื่อชั่วคราวคืออะไร?

คุณสามารถทำสิ่งต่อไปนี้ตามคำตอบที่นั่น:

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

จากนั้นคุณสามารถดูท่อด้วย:

foo $tmppipe

จากนั้นลบเมื่อเสร็จแล้ว



0

xargs ดูเหมือนว่าจะทำงานได้ดีสำหรับสิ่งนี้:

echo longfile.txt | xargs pv

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