Я столкнулся с той же проблемой сегодня после обновления до 5.0.14 (я на Ubuntu 15.10, использую официальный Virtualbox apt repo)
Я исправил это с помощью:
sudo /usr/lib/virtualbox/vboxdrv.sh setup
Переменная nameref для "обычной" переменной то же самое, что символическая ссылка для обычного файла.
$ typeset -n ref=actual; ref=foo; echo "$actual"
foo
Цикл for выполняет тело цикла с переменной цикла ("управляющей переменной"), связанной по очереди с каждым словом в списке.
$ for x in one two three; do echo "$x"; done
one
two
three
Это эквивалентно записи последовательных присваиваний:
x=one; echo "$x"
x=two; echo "$x"
x=three; echo "$x"
Если переменная цикла - имярек, то тело выполняется с имяреком, нацеленным на каждый элемент списка слов по очереди. Это не эквивалентно серии присваиваний, как выше: присваивание ref=value
, где ref
- имярек, повлияет на переменную, на которую указывает ref
, но цикл for изменяет то, на что указывает имярек, а не следует за ссылкой, чтобы изменить переменную, на которую она указывает.
$ original=0; one=1; two=2; three=3
$ typeset -n ref=original
$ echo $ref
0
$ for ref in one two three; do echo "$ref"; done
1
2
3
$ echo original
0
Перенаправление может наблюдаться и при присваивании, если вы присваиваете переменную цикла (что нечасто, но допускается).
$ one=1; two=2; three=3
$ typeset -n ref
$ for ref in one two three; do echo ref=$((ref+10)); done
$ echo "$one $two $three"
11 12 13
Последнее предложение объясняет, что целью ссылки на имя может быть массив. Сам nameref не является массивом, это все еще скалярная переменная, но когда он используется в присваивании или в разыменовании, он действует как тот же тип, что и переменная, на которую он указывает.
$ a=(0 1 2)
$ typeset -n ref=a
$ ref[1]=changed
$ echo "${a[@]}"
0 changed 2