Некоторые программы будут использовать такие параметры:
$ someprogram -orange apple
И другие программы будут использовать что-то вроде этого:
$ otherprogram --orange apple
Есть ли "правило" или соглашение для этого в Linux/Unix/OSX?
Наиболее распространенным является стиль GNU getopt , с одной чертой для коротких опций и двумя чертами для длинных.
Первоначально Unix-программы использовали однобуквенные опции, начинающиеся с одной черты и опционально связанные:
ls -laF
ls -l -a -F
Две команды выше равны.
Когда параметр принимает значение, он переопределяет пакетирование: в gpg -aofoo.gpg , -a и -o - параметры, а foo.gpg - значение, присвоенное -o .
Во всяком случае, большинство из них.
tar cvzf - это обычное явление. Текущие версии также принимают tar -cvzf , и в зависимости от того, добавляете ли вы тире, аргументы будут интерпретироваться по-разному. Например, эти два значения означают одно и то же (обратите внимание, что параметры без черточки находятся не сразу перед их значением):
tar -xf file.tgz -vzO /etc/passwd /var/backups
tar xfvzO file.tgz /etc/passwd /var/backups
BSD ps всегда использует - ; SysV ps никогда не делает. Версия Linux принимает обе версии и меняет свое поведение в зависимости от того, был ли перед параметром префикс с тире. (В отличие от приведенного выше примера tar, ps также изменяет значения параметров.)
Программы X11 использовали длинные опции, перед которыми ставится одиночная черта или иногда знак плюс:
xterm -class FooTerm +vb -u8
Это устанавливает параметры class и u8 и отменяет параметр vb .
Стиль X11 несовместим с комплектацией опций.
Позже в GNU getopt() были добавлены длинные опции, совместимые с однобуквенными.
gpg -se --no-armor --output=signed.gpg
Это устанавливает -s , -e и --no-armor (что противоположно --armor).
Обычно, --output=signed.gpg и --output signed.gpg эквивалентны. (Но не всегда - например, curl не принимает первое, только второе.)
(Если я правильно помню, длинные опции использовали префикс + до того, как он был изменен на -- .)
В спецификации POSIX есть раздел Синтаксис аргумента служебной программы , в котором описываются односимвольные параметры.
Большинство программ Windows используют свои собственные парсеры, сводя пользователей с ума.
/a /b /c , другие допускают VMS-стиль /a/b/c , а другие предпочитают Unix-стиль /abc ./ качестве префикса, некоторые также принимают - , другие принимают только - ./foo bar , /foo=bar , /foo:bar ./quoted "like this" , но некоторые программы воспринимают " как буквальный символ». (Это недостаток, позволяющий программе самостоятельно разбивать слова; в Unix это обрабатывается оболочкой.)getopt .Обычно первая встречается в старых программах, которые слишком хорошо укоренились для изменения.  Такие длинные параметры несовместимы со стандартной функцией getopt() .
Второй стиль был введен GNU getopt_long() и соответствует существующим стандартам, которые предполагают, что первый стиль будет связан с короткими опциями (то есть ожидается, что -orange означает -o -r -a -n -g -e),  Этот стиль длинного варианта настоятельно рекомендуется.