Я только что понял, что at
принимает команды от stdin
, поэтому я передал ей свою команду с аргументами:
echo "command '${UM_MOUNTPOINT}'" | at now
Это решило проблему.
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.