Длинные опции.
Программам GNU рекомендуется использовать длинные опции в форме --help, --verbose и т. д. Такие опции, поскольку они начинаются с '--', не конфликтуют с соглашениями POSIX. Их также легче запомнить (знающим англ. язык), и они предоставляют возможность последовательности среди всех плит GNU. (Например, --help является везде одним и тем же, в отличие от -h для «help», -i для «information» и т. д.) Длинные опции GNU имеют свои собственные соглашения, реализованные в функции getopc_long(3):
У программ, реализующих инструменты POSIX, каждая короткая опция (один символ) должна иметь также свой вариант в виде длинной опции.
Дополнительные специфические для GNU опции не нуждаются в соответствующей короткой опции, но мы рекомендуем это сделать.
Длинную опцию можно сократить до кратчайшей строки, которая остается уникальной. Например, если есть две опции --verbose и --verbatim, самыми короткими сокращениями будут --verbo и --verba.
Аргументы опции отделяются от длинных опций либо разделителем, либо символом = . Например, --sourcefile=/some/file или --sourcefile /some/file.
Опции и аргументы могут быть заинтересованы в операндах командной строки; getopc_long( ) переставляет аргументы таким образом, что сначала обрабатываются все опции, а затем все операнды доступны последовательно. (Такое поведение можно запретить.)
Аргументы опции могут быть необязательными. Для таких опций считается, что аргумент присутствует, если он находится в одной строке с опцией. Это работает лишь для коротких опций. Например, если -х такая опция и дана строка ' foo -xRUSSIANS -z' аргументом -х является 'RUSSIANS'. Для 'fоо -х -z' у -х нет аргументов.
Программы могут разрешить длинным опциям начинаться с одной черточки. (Это типично для многих программ X Window.)
GNU Coding Standards уделяет значительное место перечислению всех длинных и коротких опций, используемых программами GNU. Если вы пишете программу, использующую длинные опции, посмотрите, нет ли уже использующихся имен опций, которые имело бы смысл использовать и вам.
Базовая обработка командной строки
Программа на Си получает доступ к своим аргументам командной строки через параметры argc и argv. Вы можете дать этим переменным любые другие имена! Хотя лучше этого не делать, т.к. код Вашей программы могут читать другие люди, а имена argc и argv понятны всем. Параметр argc является целым, указывающим число имеющихся аргументов (argument count), включая имя команды. Параметр argv (argument variables) является указателем на массив строк, разделенных пробелом. Каждая строка – это отдельный аргумент. Есть два обычных способа определения main( ), отличающихся способом объявления argc:
int main(int argc, char *argv[ ]) или int main(int argc, char **argv)
Практически между двумя этими объявлениями нет разницы, хотя первое концептуально более понятно: argc является массивом указателей на символы. А второе определение технически более корректно, это то, что показано на рис. 2 изображена эта ситуация:
char ** char *
“cat” ‘\0’
“file1” ‘\0’
“file2” ‘\0’
Рис. 2 Память для argc
По соглашению, argv[0] является именем программы. Последующие элементы argv[1], argv[2] и т.д. являются аргументами командной строки. Последним элементом массива argv является указатель NULL.
Параметр argc указывает, сколько имеется аргументов; поскольку в Си индексы отсчитываются с нуля, выражение 'argv [argc] == NULL' всегда верно. Из-за этого, особенно в коде для UNIX, можно увидеть различные способы проверки окончания списка аргументов, такие, как цикл с проверкой, что счетчик превысил argc, или 'argv[i] == 0', или '*argv != NULL' и т.д. Они все эквивалентны.