É fácil entender por que ele falha quando você pensa em:
echo $text>some-file
Você não gostaria que se comportasse de maneira diferente se $text contivesse um número.
Você precisaria usar eval aqui:
eval 'exec '"$fd"'> "$file"'
(você deseja que $fd seja expandido nos argumentos para eval , mas não $file ).
Note que ksh93, zsh e bash introduziram (em abril de 2005, zsh 4.3.0, bash 4.1-alpha, ksh93r) a possibilidade de ter fds dinâmicos, como:
exec {fd}> "$file"
Aqui, o descritor de arquivo (um livre acima de 10) é escolhido pelo shell e armazenado na variável $fd .
Que você pode usar com ... >&$fd .
Ele combina mais de perto com o que você faz em outros idiomas: fd = open(...) , write(fd, ...) .