Linux программирование в примерах - Страница 12
Рис. 2.1. Компоненты командной строки
Таким образом,
patfile
fgrep
2.1.1. Соглашения POSIX
Стандарт POSIX описывает ряд соглашений, которых придерживаются удовлетворяющие стандарту программы. Никто от вас не требует, чтобы ваши программы удовлетворяли этим стандартам, но это хорошая мысль сделать так: пользователи Linux и Unix по всему миру понимают и используют эти соглашения, и если вы не будете им следовать, ваши пользователи будут несчастны. (Или у вас вообще не будет пользователей!) Более того, функции, которые мы обсуждаем далее в этой главе, освобождают вас от бремени ручной реализации этих соглашений для каждой программы, которую вы пишете. Вот эти правила, перефразированные из стандарта:
1. В имени программы должно быть не менее двух и не более девяти символов.
2. Имена программ должны содержать лишь строчные символы и цифры.
3. Имя опции должно быть простым буквенно-цифровым символом. Опции с множеством цифр не должны допускаться. Для производителей, реализующих утилиты POSIX, опция
-W
4. Все опции должны начинаться с символа '
-
5. Для опций, не требующих аргументов, должно быть возможно объединение нескольких опций после единственного символа '
-
foo -a -b -c
foo -abc
6. Когда опции все же требуется аргумент, он должен быть отделен от опции пробелом (например, '
fgrep -f patfile
Однако, стандарт допускает историческую практику, при которой иногда опция и ее операнд могут находиться в одной строке: '
fgrep -fpatfile
getopt()
getopt_long()
-fpatfile
-f patfile
-f -p -a -t ...
7. Аргументы опций не должны быть необязательными.
Это означает, что если в документации программы указано, что опции требуется аргумент, этот аргумент должен присутствовать всегда, иначе программа потерпит неудачу GNU
getopt()
8. Если опция принимает аргумент, который может иметь несколько значений, программа должна получать этот аргумент в виде одной строки со значениями, разделенными запятыми или разделителем.
Например, предположим, что гипотетической программе
myprog
-u
myprog -u "arnold,joe,jane" /* Разделение запятыми */
myprog -u "arnold joe jane" /* Разделение пробелами */
В таком случае вы должны самостоятельно отделить и обработать каждое значение (т.е. здесь нет стандартной процедуры), но ручная реализация обычно проста.
9. Опции должны находиться в командной строке первыми, перед операндами. Версии
getopt()
getopt()
10. Специальный аргумент '
--
11. Порядок, в котором приведены опции, не должен играть роли. Однако, для взаимно исключающих опций, когда одна опция перекрывает установки другой, тогда (так сказать) последняя побеждает. Если опция, имеющая аргумент, повторяется, программа должна обработать аргументы по порядку. Например, '
myprog -u arnold -u jane
myprog -u "arnold, jane"
getopt()
12. Нормально, когда порядок аргументов имеет для программы значение. Каждая программа должна документировать такие вещи.
13. Программы, читающие или записывающие именованные файлы, должны трактовать единственный аргумент '
-
Отметим, что многие стандартные программы не следуют всем указанным соглашениям. Главной причиной является историческая совместимость; многие такие программы предшествовали систематизации этих соглашений.
2.1.2. Длинные опции GNU
Как мы видели в разделе 1.4.2 «Поведение программ», программам GNU рекомендуется использовать длинные опции в форме
--help
--verbose
--
--help
-h
-i
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
-х