Я попытался создать переменную, чтобы выполнить какую-то операцию в k8s. Я намеренно поставил пробел между «=» и экспортом, а мой cmd я хочу сократить. Почему оболочка Linux выдает ошибку?
export do = '--dry-run=client -o yaml'
-bash: export: `=': not a valid identifier
-bash: export: `--dry-run=client -o yaml': not a valid identifier
3 ответа
Основная операция в оболочке — запуск команды. Вы делаете это, указав имя команды, за которым следует необязательный список аргументов, разделенных пробелами. Все остальные части синтаксиса вытекают из этого.
export do = '--dry-run=client -o yaml'
— это просто вызов команды export
с тремя отдельными аргументами. Задания нет.
Присваивание — это одно слово, содержащее один =
, которое появляется в соответствующем контексте. В случае команды export
каждый из ее аргументов может быть либо:
- Действительный идентификатор, на котором установлен атрибут экспорта
- Допустимое присвоение в форме
name=value
, и в этом случаеname
получает атрибут экспорта и имени присваивается значениеvalue
.
Как упоминалось в комментариях, для хранения списков аргументов лучше использовать массив. (Обратите внимание, что вы не можете экспортировать array
, и вам, вероятно, не нужно экспортировать какое-либо имя, которое будет использоваться только в оболочке, а не в среде дочернего процесса.)
do=(--dry-run=client -o yaml)
some_command "${do[@]}" # instead of some_command $do
Причина, по которой это не работает, связана с обратной совместимостью для bash. Синтаксис, который вы используете в CLI, такой же, как и в сценарии оболочки; сценарии оболочки всегда будут брать первое слово в каждой строке и интерпретировать их как команды.
Все, что отделено пробелом после имени команды, будет интерпретироваться как список аргументов, разделенных пробелами. Давайте посмотрим на более простую версию вашего экспорта, так как она, по сути, устанавливает вашу определенную переменную как переменную среды:
# This will evaluate to the command 'do' being executed with '='
# and '--dry-run=client -o yaml' being evaluated as arguments
do = '--dry-run=client -o yaml'
Чтобы обойти это, Bash требует, чтобы ваши назначения переменных выполнялись без пробелов. Таким образом, bash может искать любые знаки равенства в вашей команде и вместо этого интерпретировать их как присваивания.
# Assigns the string '--dry-run=client -o ymal' to the variable 'do'
do='--dry-run=client -o yaml'
Поскольку экспорт просто берет присваивание переменной и превращает ее в глобальную переменную среды, вам нужно следовать тому же соглашению:
export do='--dry-run=client -o yaml'
Экспорт работает как любая программа unix:
program agr1 arg2
Аргументы разделены пробелами, поэтому в вашем случае аргументы:
arg1: "do"
arg2: "="
arg3: "'--dry-run=client -o yaml'"
И export
не может с этим справиться, потому что это бессмысленно.
Но если вы попробуете это:
export a='echo a' b='echo b'
Аргументы будут:
arg1: "a='echo a'"
arg2: "b='echo b'"
И export
знает этот синтаксис.
Похожие вопросы
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.