Необходимо ли в параметрах командной строки ставить знак равенства между именем параметра и его значением?

Необходимо ли в параметрах командной строки ставить знак равенства между именем параметра и его значением?

Просто используя kubectlв качестве примера, я отмечаю, что

kubectl run --image nginx ...

и

kubectl run --image=nginx ...

оба работают.

Существует ли правило для программ командной строки в целом о том, разрешен/обязан ли знак равенства между именем параметра и его значением?

решение1

В целом реализация интерпретации аргументов командной строки полностью остается на усмотрение программиста.

Тем не менее,во многих случаях, значение «длинной» опции (такой как представленная с --option_name) указывается с помощью , =между именем опции и значением (т. е. --option_name=value), тогда как для однобуквенных опций более принято разделять флаг и значение пробелом, например -o value, или вообще не использовать разделитель (как в -oValue).

Пример из man-страницы утилиты GNU date:

  -d, --date=STRING
        display time described by STRING, not 'now'
  -f, --file=DATEFILE
        like --date; once for each line of DATEFILE

Как вы можете видеть, значение будет отделено пробелом от переключателя опций при использовании «короткой» формы (т.е. -d), но =при использовании «длинной» формы (т.е. --date) — пробелом.

Редактировать

Как отметил Стивен Китт,Стандарт кодирования GNUрекомендует использовать getoptи getopt_longдля разбора параметров командной строки. Страница man-страницы getopt_longсостояний:

Длинный параметр может принимать параметр в форме --arg=paramили --arg param.

Таким образом, программа, использующая эту функцию, будет принимать обе формы.

решение2

Существует ли правило для программ командной строки в целом о том, разрешен/обязателен ли знак равенства между переключателем и значением?

Нет, не существует. В мире открытого исходного кода и вычислений в целом существует множество конкурирующих стандартов (обязательно xkcd) и каждый может в любое время придумать новые правила и стандарты. Синтаксис аргумента утилиты POSIX например, =вообще не упоминается, например, в то время какчеловек getoptупоминает об этом. На практике вы можете столкнуться со всеми видами программ командной строки:

Те, которые принимают длинное значение параметра после =или после пробела:

$ touch a b c d
$ ls --format=verbose
total 0
-rw-r--r-- 1 ja users 0 Mar 17 14:39 a
-rw-r--r-- 1 ja users 0 Mar 17 14:39 b
-rw-r--r-- 1 ja users 0 Mar 17 14:39 c
-rw-r--r-- 1 ja users 0 Mar 17 14:39 d
$ ls --format verbose
total 0
-rw-r--r-- 1 ja users 0 Mar 17 14:39 a
-rw-r--r-- 1 ja users 0 Mar 17 14:39 b
-rw-r--r-- 1 ja users 0 Mar 17 14:39 c
-rw-r--r-- 1 ja users 0 Mar 17 14:39 d

Те, которые не принимают длинное значение параметра после себя =, но требуют пробела:

$ readelf  -a main | grep  'program interpreter'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ patchelf --set-interpreter=fake main
patchelf: getting info about '--set-interpreter=fake': No such file or directory
$ patchelf --set-interpreter fake main
$ readelf  -a main | grep  'program interpreter'
      [Requesting program interpreter: fake]

Те, которые принимают ценность после =, но не принимают варианты с -или --:

dd if=/dev/urandom of=~/Desktop/test.txt bs=1M count=3

Может быть много причин, по которым данная программа командной строки принимает входные данные определенным образом: видение автора, потому что никого это не волнует, потому что автор не знал, что кто-то другой уже придумал стандарт, потому что программа была перенесена на Unix с другой операционной системы с совершенно другими соглашениями илибыло сделано так, чтобы оно выглядело так, как будто оно было.

Связанный контент