Просто передайте это:
seq 1 5 |
while read l; do
DUMP > "$l".dump
echo "$l"
done |
while read l; do
RESTORE < "$l".dump
echo "$l"
done
Но, вероятно, лучше использовать другой дескриптор для передачи данных между каналами, чтобы журналы печатались хорошо:
seq 1 5 |
while read l; do
DUMP "$l"
echo "$l" >&3
done 3> >(
while read l; do
RESTORE "$l"
done
) |
cat
Пример выполнения сдве заглушки:
DUMP() {
sleep 0.$(($RANDOM % 10))
echo "DUMPING $1"
}
RESTORE() {
sleep 0.$(($RANDOM % 10))
echo "RESTORING $1"
}
выглядит круто:
DUMPING 1
RESTORING 1
DUMPING 2
RESTORING 2
DUMPING 3
DUMPING 4
DUMPING 5
RESTORING 3
RESTORING 4
RESTORING 5
На конце | cat
необходим для синхронизации процесса подстановки.
Что в этом крутогоВы можете использовать такие инструменты, как xargs
, чтобы легко распараллелить функции DUMP
и RESTORE
, например, 3 DUMP
с параллельной и 2 RESTORE
параллельной:
DUMP() {
echo "DUMPING $1"
sleep 0.$(($RANDOM % 10))
echo "DUMPED $1"
}
RESTORE() {
echo "RESTORING $1"
sleep 0.$(($RANDOM % 10))
echo "RESTORED $1"
}
export -f DUMP RESTORE
seq 1 5 |
xargs -n1 -P3 bash -c 'DUMP "$1"; echo "$1" >&3' -- 3> >(
xargs -n1 -P2 bash -c 'RESTORE "$1"' --
) | cat
И этовыглядит даже круче:
DUMPING 1
DUMPING 2
DUMPING 3
DUMPED 3
RESTORING 3
DUMPING 4
DUMPED 4
RESTORED 3
RESTORING 4
DUMPING 5
DUMPED 1
RESTORING 1
RESTORED 4
DUMPED 2
RESTORING 2
DUMPED 5
RESTORED 2
RESTORING 5
RESTORED 1
RESTORED 5