Научись вопросы правильно задавать. Если тебе интересно почему выбран именно дефис, причина в конструкции древних клавиатур и соображениях эргономики. Спец.символов было не так много, и минус находился на самом удобном месте.
Да не, вы не поняли. Я же пример привёл в первом посте. Зачем вообще нужен дополнительный символ (дефис или слеш или...) перед названиями опций? Что он даёт? Эргономику? — не вижу приемуществ. Исключение коллизий с именами файлов и пр. — нет, ибо имена файлов и пр. могут быть любыми.
Тут дело не в эрногомике или визуальной красивости. Дефисами и прочими слэшами упрощается задача парсинга опций и их параметров.
Точно так же убавил работы себе и своему детищу Ларри Уолл, свалив весь этот гемор с парсингом идентификаторов на головы пользователей Perl (почему практически все другие языки прекрасно обходятся без подобного идиотизма, единым пространством имён идентификаторов?).
В никсах, в основном, приняты дефисы, в оффтопике, преимущественно, слэши. Хотя этим традициям следуют не все программы (например dd) и никто не заставляет им следовать.
Ну вот мне неудобно нажимать Enter/правый шифт мизинцем (сильно далеко его тянуть), особенно на полноразмерных клавах. И что, собственно, с этого? Проблемы моих лап никого не волнуют, и это правильно.
И т. д. Меня волнует действительно объективная причина, почему возникла традиция использовать дефисы в качестве префикса. Только, пожалуйста, опять не надо отвечать, что это для исключения коллизий с параметрами — ничего эти дефисы не исключают.
В первом случае у тебя парсинг идет за счет порядка следования опций (что не всегда удобно, например в файнде такое точно не прокатит), во втором случае у тебя вместо минуса перед опцией = между опцией и значением.
Поясняю. Если никак не выделять ключевые слова опций, перемешивая их с прочими аргументами командной строки, тогда нужно проверять на принадлежность словарю ключевых слов все аргументы командной строки подряд. С дефисами эту операцию можно немножко ускорить/упростить, например, при помощи какой-нибудь строковой функции, наподобие split. С ними множество слов опций, по задумке, никогда не должно пересекаться с множеством остальных аргументов командной строки.
Параметр задаётся по правилам имён переменных в С, например.
Значение представляется либо числом, либо строкой в кавычках, по правилам того же С, например.
Экранирование параметров с дефисами относится к библиотеке парсинга опций (getopt). В принципе, можно было бы и без экранирования обойтись. С пробелами вроде бы понятно все. Или у тебя проблемы с этим?
С ними множество слов опций, по задумке, никогда не должно пересекаться с множеством остальных аргументов командной строки.
Вот в этом и загвоздка. Ладно, имена файлов нормальные люди не начинают с дефиса (хотя ненормальные — вполне могут). Но параметрами могут быть любые данные: строка для поиска, например. По идее, если уж исключать коллизии, то спецсимвол нужно добавлять как раз к *данным*, передаваемым пользователем, а не к ключевым словам программы, множество которых известно и ограничено.
Что надо программе? Программе надо набор пар (параметр, значение), где «параметр» это как бы переменная, а «значение» это число или строка, задающие значение переменной. Просто набор значений имеет смысл лишь в том случае, когда имеется позиционная привязка значений к переменным-параметрам, как в вызове функции.
проектирование интерфейса консольной программы move, переписывающей из файла в файл N байт.
№1 move from="A" to="B" count=10 // аналог из С { from="A"; to="B"; count=10; }
№2 move from "A" to "B" count 10 // упрощение для неявной работы с парами без =
№3 move "A" "B" 10 // аналог вызова функции из С { move("A", "B", 10); }
Лично мне симпатичен варианты №1 и №3. Но если параметров много, то только вариант №1.