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.