Я попытался создать переменную, чтобы выполнить какую-то операцию в 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
ERJAN 15 Янв 2022 в 21:50
2
Помимо вашего вопроса, вам лучше поместить эти флаги в переменную массива.
 – 
The Fool
15 Янв 2022 в 21:55

3 ответа

Основная операция в оболочке — запуск команды. Вы делаете это, указав имя команды, за которым следует необязательный список аргументов, разделенных пробелами. Все остальные части синтаксиса вытекают из этого.

export do = '--dry-run=client -o yaml' — это просто вызов команды export с тремя отдельными аргументами. Задания нет.

Присваивание — это одно слово, содержащее один =, которое появляется в соответствующем контексте. В случае команды export каждый из ее аргументов может быть либо:

  1. Действительный идентификатор, на котором установлен атрибут экспорта
  2. Допустимое присвоение в форме name=value, и в этом случае name получает атрибут экспорта и имени присваивается значение value.

Как упоминалось в комментариях, для хранения списков аргументов лучше использовать массив. (Обратите внимание, что вы не можете экспортировать array, и вам, вероятно, не нужно экспортировать какое-либо имя, которое будет использоваться только в оболочке, а не в среде дочернего процесса.)

do=(--dry-run=client -o yaml)

some_command "${do[@]}"  # instead of some_command $do
3
chepner 15 Янв 2022 в 22:00

Причина, по которой это не работает, связана с обратной совместимостью для 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'
1
avgvtvs 15 Янв 2022 в 22:11

Экспорт работает как любая программа 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 знает этот синтаксис.

0
g0mb4 15 Янв 2022 в 22:07