Просто используя 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 с другой операционной системы с совершенно другими соглашениями илибыло сделано так, чтобы оно выглядело так, как будто оно было.