这是一个运行两个子进程的示例,该子进程实现为同一个 shell 脚本的函数...一个子进程生成数字 1...5(在打印之间休眠),第二个子进程从固定的文件描述符(5,STDOUT 的第一个 FD 被重定向到),乘以 2 并再次打印。主进程将第二个进程的 STDOUT 重定向到另一个固定的文件描述符(6),然后在循环中从那个文件中读取。
它的工作原理与使用 pipe(2) 系统调用创建的 fd 对在 C 代码中所做的基本相同。要了解发生了什么,请在 strace -f 下运行脚本!
Bash 版本是在 Ubuntu/x86 上运行的 4.2.24(1)。
[ubuntu /home/chris]
$ bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
脚本输出:
[ubuntu /home/chris]
$ ./read_from_fd.sh
Got number 2.
Got number 4.
Got number 6.
Got number 8.
Got number 10.
源代码:
#!/bin/bash
# Generate data, output to STDOUT.
generate_five_numbers() {
for n in `seq 5` ; do
echo $n
sleep 2
done
}
# Read data from FD#5, multiply by two, output to STDOUT.
multiply_number_from_fd5_by_two() {
while read n <&5 ; do
echo "$(( $n * 2 ))"
done
}
# choose your FD number wisely ;-)
# run generator with its output dup'ed to FD #5
exec 5< <( generate_five_numbers )
# run multiplyier (reading from fd 5) with output dup'ed to FD #6
exec 6< <( multiply_number_from_fd5_by_two )
# read numbers from fd 6
while read n <&6 ; do
echo "Got number $n."
done
运行时的进程树:
──read_from_fd.sh(8118)─┬─read_from_fd.sh(8119)───sleep(8123)
└─read_from_fd.sh(8120)