вторник, 28 декабря 2010 г.

Чем отличаются опции с одним дефисом от опций с двумя в консольных приложениях?

Сегодня как будто заново родился в прямом смысле слова.

Можно значительно улучшить разработку скриптов с применением утиллит консольного типа поддерживающих задание опций в стиле UNIX подхода и поддерживать его в своих тулзах. Вероятно вы видели в консоли строку помощи, подобную этой:


c:\tools\grep_>grep --help
Usage: grep [OPTION]... PATTERN [FILE] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression
-F, --fixed-strings PATTERN is a set of newline-separated strings


Возможно у Вас также как и у меня возникали вопросы:
  1. А чем отличаются опции с одним дифисом, от опций с двумя дефисами?
  2. Если обе опции ведут к одному и тому же, то зачем вводить две?
Введем терминологию(не моя, услышал от коллеги):
  1. Короткие опции, помечаемые одним дефисом;
  2. Длинные опции, помечаемые двумя дефисами.

Для того чтобы понять эту разницу, нужно осознавать, что существуют два случая применения программ консольного типа:
  1. В визуальной среде позволяющей интерактивно работать с програмами консольного типа(К примеру: для MS Windows это "cmd.exe", либо FAR с горячей клавишей "ctrl+O");
  2. В командных сценариях(*.bat, *.cmd, *.sh, etc). 


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

Для второго случая следует, когда утилиты консольного типа используются в скриптах. Их применение предполагает, что в будущем возможно придется изменить скрипт, а это надо означает, что надо помнить значение каждой опции и при этом скрипт может быть сколь угодно большим. Для таких опций используются два дефиса.

Осталось пояснить еще один нюанс, который весьма важен и который нужно знать!
Значения в коротких опциях, следуют через пробел, а в длинных через символ "=" , который в языке программирования в "С" означает "присвоить".