ОС : Ubuntu 16.04.3
Оболочка : Bash 4.3.48
Я знаю, что возможно временно изменить содержимое переменной, как var=value command
, вероятно, IFS= read -r var
наиболее заметный случай этого.
И, благодаря вики Грега , я также понимаю:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
Что ускользает от моего понимания, так это:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Насколько я знаю (и следуя логике предыдущих примеров), его следует печатать bar
, а не (bar baz)
.
Это случается только со мной? Это предполагаемое поведение, и я что-то упустил? Или это ошибка?
export var=(foo bar); echo "${var[0]}"
это печатаетfoo
, нет(foo bar)
.export
это показывает:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
здесь ничего не выводится.foo() { declare -p var; } ; var=(bar baz) foo
даетdeclare -x var="(bar baz)"
подтверждение того, что он рассматривается как строка, а не как массивОтветы:
Вообще звонит:
где
cmd
функция не является переносимой.С
bash
, это работает только для скалярных переменных (и сx=(...)
проанализированным как массив, но назначенным как скаляр), и есть ряд проблем с областью видимости, если вы сделаете это, сksh93
иyash
, это работает, но определение переменной остается после. Сmksh
, вы получите синтаксическую ошибку. В оболочке Bourne он вообще не работал, даже для скалярных переменных.Также обратите внимание, что даже со скалярными переменными то, будет ли переменная в конечном итоге экспортирована в функцию (то есть передана выполняемым командам), варьируется от оболочки к оболочке (это в bash, yash, mksh, zsh, но не в ksh, ясень).
Это работает только так, как вы ожидаете
zsh
. Обратите внимание, чтоzsh
индексы массива начинаются с 1.источник
Это не просто ошибка, это, кажется, нереализованная функция без каких-либо планов. Это сообщение в списке рассылки 2014 года имеет это от создателя:
Вытащить из последнего git-репо для Bash это
variables.c
:Предположение, что все, что там, не полно.
источник
execve()
задействованы системные вызовы. Смотритеzsh
для оболочки, которая поддерживает вызов функций с массивом, временно установленным таким образом.my_var=one func_bar
. Можно ли сказать, чтоexport
это добавляет к окружающей среде и, таким образом, экспорт используется здесь, под капотом? Посмотрите на мой ответ, я добавил демонстрационный код.Из
man bash
раздела «Ошибки» (версияbash
4.3):Следующий код демонстрирует, что временная переменная существует в среде только во время работы функции. Когда функция завершена, временная переменная исчезает.
Связанная информация:
VAR=VALUE some-command
строительстве.источник