Для Вашей перекрывающейся проблемы, на Linux (и с bash
или zsh
но не с ksh93
), Вы могли сделать это как:
somefunction()
(
if [ "$1" -eq 1 ]
then
echo "Hello world!"
else
exec 3> auxfile
rm -f auxfile
somefunction "$(($1 - 1))" >&3 auxfile 3>&-
exec cat <(command1 < /dev/fd/3) \
<(command2 < /dev/fd/3) \
<(command3 < /dev/fd/3)
fi
)
Отметьте использование (...)
вместо {...}
получить новый процесс при каждом повторении, таким образом, у нас может быть новый fd 3, указывающий на новое auxfile
. < /dev/fd/3
прием должен получить доступ к этому теперь удаленный файл. Это не будет работать над системами кроме Linux где < /dev/fd/3
похож dup2(3, 0)
и так fd 0 было бы открыто в режиме только для записи с курсором в конце файла.
Для предотвращения ветвления для вложенного somefunction Вы могли записать это как:
somefunction()
{
if [ "$1" -eq 1 ]
then
echo "Hello world!"
else
{
rm -f auxfile
somefunction "$(($1 - 1))" >&3 auxfile 3>&-
exec cat <(command1 < /dev/fd/3) \
<(command2 < /dev/fd/3) \
<(command3 < /dev/fd/3)
} 3> auxfile
fi
}
Оболочка заботилась бы о резервном копировании fd 3 при каждом повторении. Вы закончили бы тем, что закончились дескрипторы файлов раньше все же.
Хотя Вы найдете, что это - более эффективное, чтобы сделать это как:
somefunction() {
if [ "$1" -eq 1 ]; then
echo "Hello world!" > auxfile
else
somefunction "$(($1 - 1))"
{ rm -f auxfile
cat <(command1 < /dev/fd/3) \
<(command2 < /dev/fd/3) \
<(command3 < /dev/fd/3) > auxfile
} 3< auxfile
fi
}
somefunction 12; cat auxfile
Таким образом, не вкладывайте перенаправления.