Вот пример, который запускает два подпроцесса, реализованных как функции одного и того же сценария оболочки ... Один подпроцесс генерирует числа 1 ... 5 (засыпает между отпечатками), второй читает из фиксированного файлового дескриптора (5, в который STDOUT из первый FD перенаправляется на), умножается на 2 и снова печатается. Основной процесс перенаправляет STDOUT этого второго процесса на другой фиксированный файловый дескриптор (6), а затем читает из этого в цикле.
Он работает в основном так же, как и в C-коде, с парами fd, созданными системным вызовом pipe (2). Чтобы понять, что происходит, запустите сценарий под strace -f!
Версия Bash - 4.2.24 (1), работающая на Ubuntu / x86.
[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)
person
Christian Vogel
schedule
07.12.2012
mktemp
, чтобы придумать уникальное имя - person Alexandre C.   schedule 02.06.2012