Почему не требуется заключать `$bar` в двойные кавычки в присваивании `foo=$bar`?

Я только что понял, что atпринимает команды от stdin, поэтому я передал ей свою команду с аргументами:

echo "command '${UM_MOUNTPOINT}'" | at now

Это решило проблему.

2
04.08.2017, 02:01
1 ответ
foo=$bar

является безопасным , потому что это присваивание и присваивание скалярной переменной с использованием синтаксиса скалярного присваивания. Это скалярный контекст , в $varможет храниться только одно значение, не имеет смысла разбивать или объединять $bar. Если в результате раскрытия получилось несколько слов, оболочке нужно было каким-то образом снова их объединить, чтобы иметь возможность сохранить их как одну строку в $foo.

Другое дело, когда вы используете:

foo=($bar)

Где вы присваиваете значение переменной массива. Там это контекст списка. Вы назначаете ряд слов элементам массива. происходит расщепление+глобус.

Также остерегайтесь двойной -природы таких вещей, как export/ local/ typeset/ declare/ readonlyв некоторых оболочках (более подробно объяснено в Являются кавычками необходимо для назначения локальной переменной?)

Вы заметите, что:

foo=$bar

анализируется как присвоение, а

"foo"=$bar

— это просто попытка запустить команду foo=content_of_bar(, в которой содержимое bar подлежит разделению + подстановке ).

В оболочках, гдеexport(и другие local/typeset... )являются ключевыми словами и встроенными (ksh, bash и последними версиями zsh ), в:

export foo=$bar

exportраспознается как ключевое слово , а foo=$barкак присваивание, поэтому $barне подлежит разделению+подстановке. Но нужно совсем немного, чтобы exportперестало распознаваться как ключевое слово . В этом случае он просто обрабатывается как простая команда, а split+glob происходит так же, как и любой аргумент любой другой команды.

И даже в тех случаях, когда exportрассматривается как ключевое слово, если аргументы не выглядят как присвоения переменных (, как в "foo"=$barвыше ), они обрабатываются как обычные аргументы. и снова подлежит split+glob.

6
27.01.2020, 21:50

Теги

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