Bem, por que isso não é possível, você não gostaria:
echo "$x">file
Para parar de funcionar se $x for um número.
Você precisa fazer:
eval 'exec '"$desc"'< "$file"'
Para o shell avaliar o código exec 5< "$file" . eval é OK, desde que você tenha cuidado para expandir apenas os itens que precisam ser expandidos (e que essas expansões são seguras) em seus argumentos (aqui usando aspas strongs para tudo, menos $desc ). O que seria errado seria algo como onde o conteúdo de eval "exec $desc< $file" $file é dado para o shell avaliar como código shell.
Com zsh , você também pode usar o sysopen incorporado no módulo zsh/system :
zmodload zsh/system
sysopen -u "$desc" -r -- "$file"
Em: zsh , bash e ksh93
exec {desc}>&-
trabalharia em fechar o fd armazenado em $desc , mas em
exec {desc}> file
O shell aloca um fd acima de 10 e atribui a $desc . Isso não pode ser usado para abrir file no fd que foi armazenado em $desc de antemão.
Observe que exec >&"$desc" funciona porque não há ambiguidade ... exceto em zsh e versões recentes de bash que têm um operador >& para redirecionar stdout e stderr para um arquivo (como em csh ), e onde echo something >& "$file" funciona apenas enquanto $file não é numérico.