Литмир - Электронная Библиотека
Содержание  
A
A

unknown option: q

argument: hi there

На самом деле и новые длинные опции, и исходные односимвольные можно смешивать. Длинным опциям также можно давать сокращенные названия, но они

должны отличаться от односимвольных опций. Длинные опции с аргументом можно задавать как единый аргумент в виде --опция= значение, как показано далее:

$ <b>./longopt --init -l --file=fred.с 'hi there'</b>

option: i

option: l

filename: fred.с

argument: hi there

Далее приведена новая программа longopt.c, полученная из программы argopt.c с изменениями, обеспечивающими поддержку длинных опций, которые в тексте программы выделены цветом.

#include &lt;stdio.h&gt;

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

<i>#define _GNU_SOURCE</i>

<i>#include &lt;getopt.h&gt;</i>

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

 int opt;

<i> struct option_longopts[] = {</i>

<i>  {&quot;initialize&quot;, 0. NULL, 'i'},</i>

<i>  {&quot;file&quot; 1, NULL, 'f'},</i>

<i>  {&quot;list&quot;, 0, NULL, 'l'},</i>

<i> {0, 0, 0, 0}};</i>

<i> while ((opt = getopt_long(argc, argv, &quot;:if:lr, longopts, NULL)) != -1) {</i>

  switch(opt) {

  case 'i':

  case 'l':

  case 'r':

   printf(&quot;option: %c\n&quot;, opt);

   break;

  case 'f':

   printf(&quot;filename: %s\n&quot;, optarg);

   break;

  case ':':

   printf(&quot;option needs a value\n&quot;);

   break;

  case '?':

   printf(&quot;unknown option: %c\n&quot;, optopt);

   break;

  }

 }

 for (; optind &lt; argc; optind++)

  printf(&quot;argument: %s\n&quot;, argv[optind]);

 exit(0);

}

Как это работает

Функция

getopt_long
принимает два дополнительных параметра по сравнению с функцией
getopt
. Первый из них — массив структур, описывающий длинные опции и сообщающий функции
getopt_long
способ их обработки. Второй дополнительный параметр — адрес переменной, которая может использоваться как вариант
optind
, предназначенный для длинных опций; для каждой распознанной длинной опции ее номер в массиве длинных опций может быть записан в эту переменную. В данном примере вам не нужна эта информация, поэтому вы используете
NULL
в качестве значения второго дополнительного параметра.

Массив длинных опций состоит из ряда структур типа

struct option
, в каждой из которых описано требуемое поведение длинной опции. Массив должен заканчиваться структурой, содержащей все нули.

Структура длинной опции определена в заголовочном файле getopt.h и должна подключаться с помощью константы

_GNU_SOURCE
, определенной для того, чтобы разрешить использование функции
getopt_long
.

struct option {

 const char *name;

 int has_arg;

 int *flag;

 int val;

};

Элементы структуры описаны в табл. 4.1.

Таблица 4.1.

Параметр опции Описание
name
Название длинной опции. Сокращения будут приниматься до тех пор, пока они не создадут путаницы при определении названий других опций
has_arg
Принимает ли эта опция аргумент. Задайте 0 для опций без аргументов, 1 для опций, у которых должно быть значение, и 2 для опций с необязательным аргументом
flag
Задайте
NULL
, чтобы
getopt_long
вернула при обнаружении данной опции значение, заданное в
val
. В противном случае
getopt_long
возвращает 0 и записывает значение
val
в переменную, на которую указывает
flag
val
Значение
getopt_long
для данной опции, предназначенное для возврата

Для получения сведений о других опциях, связанных с расширениями функции

getopt
в проекте GNU и родственных функциях, см. страницы интерактивного справочного руководства к функции
getopt
.

Переменные окружения

Мы обсуждали переменные окружения в главе 2. Это переменные, которые могут использоваться для управления поведением сценариев командной оболочки и других программ. Вы также можете применять их для настройки пользовательской среды. Например, у каждого пользователя есть переменная окружения

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

$ <b>echo $НOМЕ</b>

/home/neil

Вы также можете воспользоваться командой оболочки

set
для получения списка всех переменных окружения.

66
{"b":"285844","o":1}