В getopt(3) как для FreeBSD , так и для macOS указано (выделено мной):
Также возможно обрабатывать цифры как дополнительные буквы. Это позволяет использовать
getopt()
с программами, которые ожидают число ("-3"
) в качестве опции. Эта практика неверна, и ее не следует использовать в текущих разработках. Он предоставляется только для обратной совместимости.
Но почему это неправильно? На обеих страницах руководства приведены примеры кода, но я не понимаю, что они пытаются сделать. Я не понимаю, почему использование цифр для параметров командной строки требует особого подхода.
Ни в Linux ', ни в GNU getopt(3) не упоминаются ни цифры как буквы опций, ни то, что они неправильные. Так почему же цифры в качестве опций якобы неверны во FreeBSD и macOS?
Я видел программы, например, gzip, а также мои собственные программы, которые прекрасно используют цифры в качестве опций.
Например, head
и tail
позволяют указать количество строк с помощью опции, например head -20 filename
. Это невозможно сделать с помощью getopt()
, для этого нужен специальный анализатор аргументов. Он был модернизирован как head -n 20
, но мы застряли в старом синтаксисе устаревшего кода.
Но этот цитируемый абзац просто выглядит как мнение автора, я не думаю, что это консенсус.
Ах! Я думал о цифрах как об отдельных цифрах, например, думая о 1
так же, как, скажем, c
. Я бы не ожидал, что -12
будет означать «двенадцать» больше, чем я ожидал, что -car
будет означать car
(то есть вариант "car"
, а не вариант 'c'
с аргументом "ar"
).
И на самом деле есть программы, которые его используют именно так, например. comm
принимает варианты -1
, -2
и -3
, и вы можете комбинировать их с comm -12
.
Назвать это «неправильным» мне кажется слишком самоуверенным. Я думаю, это означает «нам это не нравится». Обратите внимание, что соответствующие рекомендации POSIX кажутся полностью открытыми для однозначных параметров: «Каждое имя параметра должно быть одним буквенно-цифровым символом (классификация символов alnum) из переносимого набора символов». Есть одна или две веские причины не любить десятичные цифры в качестве названий опций, но это не делает их неправильными.
Но почему это неправильно?
В той степени, в которой это неверно, это потому, что так утверждает автор страницы руководства BSD. Возможно, это отражает общее мнение среди разработчиков BSD, но мне трудно найти в документации BSD что-либо более авторитетное, чем то, что вы уже просматриваете.
Обратите особое внимание на то, что POSIX кажется вполне приемлемым с цифрами в качестве имен опций. Почти все, что можно сказать о том, как следует выбирать имена опций, это:
Имя каждого параметра должно состоять из одного буквенно-цифрового символа (классификация символов alnum) из переносимого набора символов.
Это включает десятичные цифры, без каких-либо оговорок.
Кроме того, документация POSIX для getopt() не содержит ничего аналогичного замечаниям BSD, о которых вы спрашиваете.
На обеих страницах руководства приведены примеры кода, но я не понимаю, что они пытаются сделать.
Обратите внимание, что на самом деле это только одна страница руководства. MacOS является производной BSD, а справочная страница Apple, на которую вы ссылаетесь, представляет собой просто перерисовку страницы BSD.
В любом случае, этот пример кода, похоже, пытается использовать getopt()
для распознавания аргументов программы, состоящих из символа -
, за которым, возможно, множество десятичных цифр, как выражения одного числа как одного унифицированного параметра. Это действительно неприятно, и поддержка этого противоречит рекомендациям POSIX, и я не рекомендую это делать. Но мне это также кажется нелогичным.
Я не понимаю, почему использование цифр для параметров командной строки требует особого подхода.
С точки зрения программирования это не так, поскольку их следует рассматривать только как отдельные цифры. Тем не менее, это оставляет возможность запутать пользователей вашей программы, когда две или более опции десятичных цифр объединены вместе. Я считаю, что это то, о чем горячо беспокоится справочная страница BSD, но перейти оттуда к неправильным однозначным параметрам - это слишком большой прыжок для меня.
Если числа превышают 9, это не дает хорошего обобщения.
-12
эквивалентно-1 -2
, а не означает 12.