Ну, что касается того, почему это невозможно, вы бы не хотели:
echo "$x">file
Перестать работать, если $x
окажется числом.
Вам необходимо сделать следующее:
eval 'exec '"$desc"'< "$file"'
Чтобы оболочка могла оценить код exec 5< "$file"
. eval
подходит до тех пор, пока вы тщательно расширяете только то, что необходимо расширить (и что эти расширения безопасны) в его аргументах (здесь, используя крепкие кавычки для всего, кроме $ описание
). Что было бы неправильно, так это что-то вроде, где содержимое eval "exec $desc< $file"
$file
дается для оценки оболочкой как код оболочки.
С zsh
вы также можете использовать sysopen
, встроенный в модуль zsh/system
:
zmodload zsh/system
sysopen -u "$desc" -r -- "$file"
In: zsh
, bash
и ksh93
exec {desc}>&-
будут работать при закрытии fd, хранящегося в $desc
, но в
exec {desc}> file
оболочка выделяет fd выше 10 и назначает на $desc
. Его нельзя использовать для открытия файла
на fd, который был заранее сохранен в $desc
.
Обратите внимание, что exec >&"$desc"
работает, потому что там нет двусмысленности... за исключением zsh
и последних версий bash
, которые имеют >&
оператор для перенаправления stdout и stderr в файл (как в csh
), и где echo что-то >& "$file"
работает только до тех пор, пока поскольку $file
не является числовым.