exec 3>&1
fd 3 теперь является dup fd 1 (в вашем примере, ваш терминал). Как сказано на странице руководства, это означает, что fd 1 и fd 3 могут использоваться как взаимозаменяемые для обозначения одного и того же файла или устройства.
Основное использование дублирования в shell - это сохранение копии fd, чтобы ее можно было восстановить позже.
my_string=$(returnString "$*")
Для того чтобы bash получил вывод stdout после оценки
returnString "$*"
, он создает pipe и развилку, а дочерняя программа вызывает dup2, чтобы переместить записывающий конец трубы (в этом примере это fd 5, но это может варьироваться) на fd 1.exec 4>&1 >&3
Перенаправления оцениваются слева направо. fd 4 устанавливается как дубликат конца трубы. Затем, fd 1 устанавливается как дубликат fd, который ссылается на ваш терминал.
echo "writing to stdout"
echoes на fd 1, ваш терминал.
exec >&4-
Это перемещает (то есть, делает dup2) fd 4 на fd 1. fd 1 теперь является концом трубы.
echo "$s"
эхо на конец трубы. В конце концов, это считывается родительской оболочкой с другого конца трубы и используется как результат
$(returnString "$*")