Почему цифры в качестве «букв» опции считаются «неправильными» для getopt(3) в BSD и macOS?

В getopt(3) как для FreeBSD , так и для macOS указано (выделено мной):

Также возможно обрабатывать цифры как дополнительные буквы. Это позволяет использовать getopt() с программами, которые ожидают число ("-3") в качестве опции. Эта практика неверна, и ее не следует использовать в текущих разработках. Он предоставляется только для обратной совместимости.

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

Ни в Linux ', ни в GNU getopt(3) не упоминаются ни цифры как буквы опций, ни то, что они неправильные. Так почему же цифры в качестве опций якобы неверны во FreeBSD и macOS?

Я видел программы, например, gzip, а также мои собственные программы, которые прекрасно используют цифры в качестве опций.

Если числа превышают 9, это не дает хорошего обобщения. -12 эквивалентно -1 -2, а не означает 12.

Barmar 05.08.2024 21:26

Например, head и tail позволяют указать количество строк с помощью опции, например head -20 filename. Это невозможно сделать с помощью getopt(), для этого нужен специальный анализатор аргументов. Он был модернизирован как head -n 20, но мы застряли в старом синтаксисе устаревшего кода.

Barmar 05.08.2024 21:27

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

Barmar 05.08.2024 21:35

Ах! Я думал о цифрах как об отдельных цифрах, например, думая о 1 так же, как, скажем, c. Я бы не ожидал, что -12 будет означать «двенадцать» больше, чем я ожидал, что -car будет означать car (то есть вариант "car", а не вариант 'c' с аргументом "ar").

Paul J. Lucas 05.08.2024 21:45

И на самом деле есть программы, которые его используют именно так, например. comm принимает варианты -1, -2 и -3, и вы можете комбинировать их с comm -12.

Barmar 05.08.2024 21:47

Назвать это «неправильным» мне кажется слишком самоуверенным. Я думаю, это означает «нам это не нравится». Обратите внимание, что соответствующие рекомендации POSIX кажутся полностью открытыми для однозначных параметров: «Каждое имя параметра должно быть одним буквенно-цифровым символом (классификация символов alnum) из переносимого набора символов». Есть одна или две веские причины не любить десятичные цифры в качестве названий опций, но это не делает их неправильными.

John Bollinger 05.08.2024 22:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Но почему это неправильно?

В той степени, в которой это неверно, это потому, что так утверждает автор страницы руководства BSD. Возможно, это отражает общее мнение среди разработчиков BSD, но мне трудно найти в документации BSD что-либо более авторитетное, чем то, что вы уже просматриваете.

Обратите особое внимание на то, что POSIX кажется вполне приемлемым с цифрами в качестве имен опций. Почти все, что можно сказать о том, как следует выбирать имена опций, это:

Имя каждого параметра должно состоять из одного буквенно-цифрового символа (классификация символов alnum) из переносимого набора символов.

Это включает десятичные цифры, без каких-либо оговорок.

Кроме того, документация POSIX для getopt() не содержит ничего аналогичного замечаниям BSD, о которых вы спрашиваете.

На обеих страницах руководства приведены примеры кода, но я не понимаю, что они пытаются сделать.

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

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

Я не понимаю, почему использование цифр для параметров командной строки требует особого подхода.

С точки зрения программирования это не так, поскольку их следует рассматривать только как отдельные цифры. Тем не менее, это оставляет возможность запутать пользователей вашей программы, когда две или более опции десятичных цифр объединены вместе. Я считаю, что это то, о чем горячо беспокоится справочная страница BSD, но перейти оттуда к неправильным однозначным параметрам - это слишком большой прыжок для меня.

Другие вопросы по теме