Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

2.1.2. Длинные опции GNU

Как мы видели в разделе 1.4.2 «Поведение программ», программам GNU рекомендуется использовать длинные опции в форме

– -help
,
– -verbose
и т.д. Такие опции, поскольку они начинаются с '
– -
', не конфликтуют с соглашениями POSIX. Их также легче запомнить, и они предоставляют возможность последовательности среди всех утилит GNU. (Например,
– -help
является везде одним и тем же, в отличие от
– h
для «help»,
– i
для «information» и т.д.) Длинные опции GNU имеют
свои собственные соглашения, реализованные в функции
getopt_long
:

1. У программ, реализующих инструменты POSIX, каждая короткая опция (один символ) должна иметь также свой вариант в виде длинной опции.

2. Дополнительные специфические для GNU опции не нуждаются в соответствующей короткой опции, но мы рекомендуем это сделать.

3. Длинную опцию можно сократить до кратчайшей строки, которая остается уникальной. Например, если есть две опции

– -verbose
и
– -verbatim
, самыми короткими сокращениями будут
– -verbo
и
– -verba
.

4. Аргументы опции отделяются от длинных опций либо разделителем, либо символом

=
. Например,
– -sourcefile=/some/file
или
– -sourcefile /some/file
.

5. Опции и аргументы могут быть заинтересованы в операндах командной строки,

getopt_long
переставляет аргументы таким образом, что сначала обрабатываются все опции, а затем все операнды доступны последовательно. (Такое поведение можно запретить.)

6. Аргументы опций могут быть необязательными. Для таких опций считается, что аргумент присутствует, если он находится в одной строке с опцией. Это работает лишь для коротких опций. Например, если -х такая опция и дана строка '

foo -хYANKEES -y
', аргументом
– х
является '
YANKEES
'. Для '
foo -х -y
' у
– х
нет аргументов.

7. Программы могут разрешить длинным опциям начинаться с одной черточки (Это типично для многих программ X Window.)

Многое из этого станет яснее, когда позже в этой главе мы рассмотрим

getopt_long
.

GNU Coding Standards уделяет значительное место перечислению всех длинных и коротких опций, используемых программами GNU. Если вы пишете программу, использующую длинные опции, посмотрите, нет ли уже использующихся имен опций, которые имело бы смысл использовать и вам.

2.2. Базовая обработка командной строки

Программа на С получает доступ к своим аргументам командной строки через параметры

argc
и
argv
. Параметр
argc
является целым, указывающим число имеющихся аргументов, включая имя команды. Есть два обычных способа определения
main
, отличающихся способом объявления
argc
:

int main(int argc, char *argv[]) int main(int argc, char **argv)

{ {

... ...

} }

Практически между двумя этими объявлениями нет разницы, хотя первое концептуально более понятно:

argc
является массивом указателей на символы. А второе определение технически более корректно, это то, что мы используем. На рис. 2.2 изображена эта ситуация.

Рис. 2.2.

Память для
argc

По соглашению,

argv[0]
является именем программы. (Детали см. в разделе 9.1.4.3. «Имена программ и
argv[0]
».) Последующие элементы являются аргументами командной строки. Последним элементом массива
argv
является указатель
NULL
.

argc
указывает, сколько имеется аргументов; поскольку в С индексы отсчитываются с нуля, выражение '
argv[argc] == NULL
' всегда верно. Из-за этого, особенно в коде для Unix, вы увидите различные способы проверки окончания списка аргументов, такие, как цикл с проверкой, что счетчик превысил
argc
, или '
argv[i] == 0
', или '
*argv != NULL
' и т.д. Они все эквивалентны.

2.2.1. Программа

echo
V7

Возможно, простейшим примером обработки командной строки является программа V7

echo,
печатающая свои аргументы в стандартный вывод, разделяя их пробелами и завершая символом конца строки. Если первым аргументом является
– n
, завершающий символ новой строки опускается. (Это используется для приглашений из сценариев оболочки.) Вот код [28] :

1 #include <stdio.h>

2

3 main(argc, argv) /*int main(int argc, char **argv)*/

28

См.

/usr/src/cmd/echo.c
в дистрибутиве V7 — Примеч. автора.

4 int argc;

5 char *argv[];

6 {

7 register int i, nflg;

8

9 nflg = 0;

10 if (argc > 1 && argv[1][0] == && argv[1][1] == 'n') {

11 nflg++;

12 argc--;

13 argv++;

14 }

15 for (i=1; i<argc; i++) {

16 fputs(argv[i], stdout);

17 if (i < argc-1)

18 putchar(' ');

19 }

20 if (nflg == 0)

21 putchar('\n');

22 exit(0);

23 }

Всего 23 строки! Здесь есть два интересных момента. Во-первых, уменьшение

argc
и одновременное увеличение
argv
(строки 12 и 13) являются обычным способом пропуска начальных аргументов. Во-вторых, проверка наличия
– n
(строка 10) является упрощением.
– no-newline-at-the-end
также работает. (Откомпилируйте и проверьте это!)

Поделиться:
Популярные книги

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Альбион сгорит!

Зот Бакалавр
10. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Альбион сгорит!

Последний Герой. Том 5

Дамиров Рафаэль
5. Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 5

Личный аптекарь императора. Том 5

Карелин Сергей Витальевич
5. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
7.50
рейтинг книги
Личный аптекарь императора. Том 5

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Последний Герой. Том 3

Дамиров Рафаэль
3. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 3

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18