สองท่อต่อหนึ่งคำสั่ง


9

ฉันสับสนเล็กน้อยตามไวยากรณ์ต่อไปนี้ แม้ว่ามันจะใช้งานได้ แต่ก็ไม่เข้าใจว่าทำไมมันถึงได้ผล ดูเหมือนว่ามีสองท่อที่ต่ออยู่กับคำสั่ง diff แต่ไม่มีเพียงอันเดียวSTDINใช่ไหม

ตัวอย่าง:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

นี่คือลิงค์ไปยังหัวข้อที่เกี่ยวข้อง- การทดแทนกระบวนการ - ในbashหน้า man
chepner

คำตอบ:


13

ไปป์นั้นถูกผูกไว้กับ file descriptors อื่นที่ไม่ใช่ 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

กระบวนการสามารถมีตัวอธิบายไฟล์เปิดได้มากกว่าหนึ่งไฟล์ในแต่ละครั้งดังนั้นจึงไม่มีปัญหา


ถ้าฉันรู้เพียงว่าเรียกว่าท่อชั่วคราวฉันจะสามารถ google ได้ ขอบคุณ!

@iblue: ฉันไม่คิดว่ามันเรียกว่า "ท่อชั่วคราว" มันเป็นเพียงท่อตามที่สร้างโดยการpipe()เรียกของระบบ
Sven Marnach

เพื่อความถูกต้องมากอาจเรียกว่า "ไพพ์ที่มีชื่อนิรนาม" แต่เพียงพอที่จะใช้กับกูเกิล

2
@WilliamPursell: ไม่มีไฟล์ที่เกี่ยวข้อง เชลล์สร้างpipe()ไพพ์ที่ไม่ระบุชื่อโดยใช้จากนั้นจะทำการประมวลผลย่อย กระบวนการหลักจะมีแฟ้มเพิ่มเติมอธิบายเปิดถ้าท่อที่ไม่ระบุชื่อถูกนำมาใช้ ไฟล์อธิบายเพิ่มเติมเหล่านี้จะถูกส่งผ่านในรูปแบบ/dev/fd/...และกระบวนการมักจะเปิดได้โดยใช้ชื่อไฟล์เหล่านี้ สิ่งนี้จะนำพวกเขาไปสู่การdup()สร้างสร้างตัวอธิบายไฟล์ที่เปิดกว้างยิ่งขึ้น กระบวนการนี้ยังสามารถใช้ file descriptor ที่มีชื่อได้ทันทีโดยไม่ต้องมีการโทรเปิด ...
Sven Marnach

1
... แสดงให้เห็นในนี้โปรแกรมการทดสอบขนาดเล็กและโง่ หลังจากรวบรวมไปaฉันก็เรียกมันว่า./a <(ls)แล้วก็ประสบความสำเร็จในการพิมพ์รายชื่อไฟล์พิสูจน์ตัวถอดรหัสชื่อไฟล์ (63 ในกรณีของฉัน) เปิดแล้ว ทุบตีอาจใช้ชื่อ pipes ในไดเรกทอรีชั่วคราวบนสถาปัตยกรรมที่แตกต่างจาก Linux ซึ่งในกรณีนี้จะไม่มีไฟล์ descriptor เพิ่มเติมที่จะเปิดเมื่อเข้าสู่กระบวนการหลัก
Sven Marnach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.