При параллельном выполнении сценария оболочки в фоновом режиме некоторые операции пропускаются.

Ну, что касается того, почему это невозможно, вы бы не хотели:

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не является числовым.

1
28.03.2016, 13:54
0 ответов

Теги

Похожие вопросы