Основы программирования в Linux
$ <b>sort -r <i>файл</i></b>Опции командной строки используются очень широко, и согласованное их применение будет реальной помощью тем, кто станет использовать вашу программу. В прошлом у каждой утилиты был свой подход к формированию опций командной строки, что приводило к некоторой путанице. Например, взгляните на то, каким способом приведенные далее команды принимают параметры:
$ <b>tar cvfB /tmp/file.tar 1024</b>$ <b>dd if=/dev/fd0 of=/trap/file.dd bs=18k</b>$ <b>ps ax</b>$ <b>gcc --help</b>$ <b>ls -lstr</b>$ <b>ls -l -s -t -r</b>Мы рекомендуем в ваших приложениях все переключатели командной строки начинать с дефиса и делать их односимвольными, состоящими из одной буквы или цифры. При необходимости опции, не содержащие последующих аргументов, могут группироваться вместе после общего дефиса. Таким образом, два только что приведенных примера с командой
соответствуют нашим рекомендациям. За каждой опцией может следовать любое необходимое ей значение как отдельный аргумент. Пример с программойlsнарушает наше правило, поскольку использует многосимвольные опции, которые начинаются совсем не с дефисов (dd): в примере с программойif=/dev/fd0опции полностью оторваны от своих значений! Целесообразно добавлять более длинные и информативные имена переключателей как альтернативу односимвольных вариантов и использовать двойной дефис для их выделения. Таким образом, у нас могут быть два варианта опции получения помощи:tarи-h.--helpЕще один недостаток некоторых программ — создание опции
(например) для выполнения функции, противоположной+x. В главе 2 мы применяли команду-хдля включения отслеживания действий командной оболочки и командуset -о xtraceдля выключения этого режима.set +о xtraceВы, вероятно, можете сказать, что запомнить порядок и назначение всех этих программных опций достаточно трудно без необходимости освоения вызывающих идиосинкразию форматов. Часто единственный выход — применение опции
(от англ. help) или страниц интерактивного справочного руководства (-h), если программист предоставил одну из этих возможностей. Чуть позже в этой главе мы покажем, что функцияmanпредоставляет изящное решение этих проблем. А сейчас, тем не менее, в упражнении 4.1 давайте посмотрим, как передаются аргументы программы.getoptУпражнение 4.1. Аргументы программыДалее приведена программа args.c, проверяющая собственные аргументы.
#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) {int arg;for (arg = 0; arg < argc; arg++) {if (argv[arg][0] == '-')printf("option: %s\n", argv[arg]+1);elseprintf("argument %d: %s\n", arg, argv[arg]);}exit(0);}Когда вы выполните эту программу, она просто выведет свои аргументы и определит опции. Суть в том, что программа принимает строковый аргумент и необязательный аргумент с именем файла, вводимый опцией
. Могут быть определены и другие опции.-f$ <b>./args -i -lr 'hi there' -f fred.c</b>argument 0: ./argsoption: ioption: lrargument 3: hi there option: fargument 5: fred.сКак это работает
Программа просто использует аргумент-счетчик
для задания цикла, просматривающего все аргументы программы. Она находит опции поиском начального дефиса.argcВ данном примере, если мы предполагаем, что доступны опции
и-l, то упускаем тот факт, что группа-r, возможно, должна интерпретироваться так же, как-lrи-l.-rВ стандарте X/Open (который можно найти по адресу http://opengroup.org/) определено стандартное применение опций командной строки (Utility Syntax Guidelines, руководство по синтаксису утилит) и стандартный программный интерфейс для представления переключателей командной строки в программах на языке С: функция
.getoptgetopt
Для того чтобы вам легче было следовать правилам, приведенным в этих руководствах, ОС Linux предлагает очень простое в применении средство
, поддерживающее использование опций со значениями и без них.getopt<b>#include <unistd.h></b><b>int getopt(int argc, char *const argv[], const char *optstring);</b><b>extern char *optarg;</b><b>extern int optind, opterr, optopt;</b>Функция
принимает параметрыgetoptиargcв том виде, в каком они передаются функцииargvв программе, и строку спецификатора опций, которая сообщаетmain, какие опции определены для программы и есть ли у них связанные с ними значения.getopt— это просто список символов, каждый из которых представляет односимвольную опцию. Если за символом следует двоеточие, это означает, что у опции есть ассоциированное значение, которое будет принято как следующий аргумент. Командаoptstringоболочки bash выполняет аналогичную функцию.getoptНапример, для обработки предыдущего примера можно было бы применить следующий вызов:
getopt(argc, argv, "if:lr");В нем учтены простые опции
,-i,-lи-r, за которыми последует аргумент с именем файла. Вызов команды с теми же параметрами, но указанными в другом порядке, изменит поведение. Вы сможете попробовать сделать это, когда получите пример кода из упражнения 4.2.-f