Tính năng đó được giới thiệu bởi ksh
(tài liệu đầu tiên trong ksh86) và đang sử dụng /dev/fd/n
tính năng này (được thêm độc lập trong một số hệ thống BSD và AT & T trước đó). Trong ksh
và lên đến ksh93u, nó sẽ không hoạt động trừ khi hệ thống của bạn có hỗ trợ cho / dev / fd / n. zsh, bash và ksh93u+
ở trên có thể sử dụng các đường ống được đặt tên tạm thời (tên ống được thêm vào trong SysIII tôi tin) trong đó / dev / fd / n không có sẵn.
Trên các hệ thống có sẵn (POSIX không chỉ định các hệ thống đó), bạn có thể tự thay thế quy trình ( ) bằng:/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
Tuy nhiên, điều đó không hoạt động với ksh93
Linux như ở đó, các ống vỏ được triển khai với các ổ cắm thay vì các ống và mở /dev/fd/3
trong đó fd 3 điểm cho một ổ cắm không hoạt động trên Linux.
Mặc dù POSIX không chỉ định . Nó chỉ định đường ống được đặt tên. Các ống được đặt tên hoạt động như các ống thông thường ngoại trừ việc bạn có thể truy cập chúng từ hệ thống tệp. Vấn đề ở đây là bạn phải tạo tạm thời và dọn sạch sau đó, điều này rất khó thực hiện, đặc biệt khi xem xét rằng POSIX không có cơ chế tiêu chuẩn (như được tìm thấy trên một số hệ thống) để tạo tệp hoặc thư mục tạm thời và xử lý tín hiệu một cách hợp lý (để dọn dẹp khi bị treo hoặc giết) cũng khó thực hiện./dev/fd/n
mktemp -d
Bạn có thể làm một cái gì đó như:
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"
(không quan tâm đến việc xử lý tín hiệu ở đây).