คุณลักษณะดังกล่าวได้รับการแนะนำโดยksh
(บันทึกเป็นครั้งแรกใน ksh86) และใช้ประโยชน์จาก/dev/fd/n
คุณลักษณะนี้ (เพิ่มอย่างเป็นอิสระในระบบ BSD และ AT&T บางรุ่นก่อนหน้านี้) ในksh
และมากถึง ksh93u มันจะไม่ทำงานจนกว่าระบบของคุณจะรองรับ / dev / fd / n zsh, bash และksh93u+
ขึ้นไปสามารถใช้ประโยชน์จาก pipe ที่มีชื่อชั่วคราว (ชื่อ pipes ที่ถูกเพิ่มเข้ามาใน SysIII ฉันเชื่อ) โดยที่ / dev / fd / n ไม่สามารถใช้ได้
บนระบบที่มีให้บริการ (POSIX ไม่ได้ระบุไว้) คุณสามารถทำการทดแทนตัวเอง ( ) ด้วย:/dev/fd/n
diff <(cmd1) <(cmd2)
{
cmd1 4<&- | {
# in here fd 3 points to the reading end of the pipe
# from cmd1, while fd 0 has been restored from the original
# stdin (saved on fd 4, now closed as no longer needed)
cmd2 3<&- | diff /dev/fd/3 -
} 3<&0 <&4 4<&- # restore the original stdin for cmd2
} 4<&0 # save a copy of stdin for cmd2
อย่างไรก็ตามมันไม่สามารถใช้งานksh93
บน Linux ได้เนื่องจากมีการใช้ shell shell กับ socketpairs แทนการเปิดไป/dev/fd/3
ที่ fd 3 คะแนนไปยัง socket ไม่ทำงานบน Linux
แม้ว่า POSIX ไม่ได้ระบุ มันระบุชื่อไปป์ ไปป์ที่มีชื่อทำงานเหมือนกับไพพ์ปกติยกเว้นว่าคุณสามารถเข้าถึงได้จากระบบไฟล์ ปัญหาที่นี่คือคุณต้องสร้างคนชั่วคราวและทำความสะอาดหลังจากนั้นซึ่งยากที่จะทำอย่างน่าเชื่อถือโดยเฉพาะอย่างยิ่งการพิจารณาว่า POSIX ไม่มีกลไกมาตรฐาน (เช่นที่พบในบางระบบ) เพื่อสร้างไฟล์หรือไดเรกทอรีชั่วคราวและการจัดการสัญญาณแบบพกพา (ทำความสะอาดเมื่อวางสายหรือฆ่า) ก็ยากที่จะทำแบบพกพา/dev/fd/n
mktemp -d
คุณสามารถทำสิ่งที่ชอบ:
tmpfifo() (
n=0
until
fifo=$1.$$.$n
mkfifo -m 600 -- "$fifo" 2> /dev/null
do
n=$((n + 1))
# give up after 20 attempts as it could be a permanent condition
# that prevents us from creating fifos. You'd need to raise that
# limit if you intend to create (and use at the same time)
# more than 20 fifos in your script
[ "$n" -lt 20 ] || exit 1
done
printf '%s\n' "$fifo"
)
cleanup() { rm -f -- "$fifo"; }
fifo=$(tmpfifo /tmp/fifo) || exit
cmd2 > "$fifo" & cmd1 | diff - "$fifo"
rm -f -- "$fifo"
(ไม่ได้ดูแลการจัดการสัญญาณที่นี่)