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

$ <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
для выключения этого режима.

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

-h
(от англ. help) или страниц интерактивного справочного руководства (
man
), если программист предоставил одну из этих возможностей. Чуть позже в этой главе мы покажем, что функция
getopt
предоставляет изящное решение этих проблем. А сейчас, тем не менее, в упражнении 4.1 давайте посмотрим, как передаются аргументы программы.

Упражнение 4.1. Аргументы программы

Далее приведена программа args.c, проверяющая собственные аргументы.

#include &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

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

 int arg;

 for (arg = 0; arg &lt; argc; arg++) {

  if (argv[arg][0] == '-')

printf(&quot;option: %s\n&quot;, argv[arg]+1);

  else

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

 }

 exit(0);

}

Когда вы выполните эту программу, она просто выведет свои аргументы и определит опции. Суть в том, что программа принимает строковый аргумент и необязательный аргумент с именем файла, вводимый опцией

-f
. Могут быть определены и другие опции.

$ <b>./args -i -lr 'hi there' -f fred.c</b>

argument 0: ./args

option: i

option: lr

argument 3: hi there option: f

argument 5: fred.с

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

Программа просто использует аргумент-счетчик

argc
для задания цикла, просматривающего все аргументы программы. Она находит опции поиском начального дефиса.

В данном примере, если мы предполагаем, что доступны опции

-l
и
-r
, то упускаем тот факт, что группа
-lr
, возможно, должна интерпретироваться так же, как
-l
и
-r
.

В стандарте X/Open (который можно найти по адресу http://opengroup.org/) определено стандартное применение опций командной строки (Utility Syntax Guidelines, руководство по синтаксису утилит) и стандартный программный интерфейс для представления переключателей командной строки в программах на языке С: функция

getopt
.

getopt

Для того чтобы вам легче было следовать правилам, приведенным в этих руководствах, ОС Linux предлагает очень простое в применении средство

getopt
, поддерживающее использование опций со значениями и без них.

<b>#include &lt;unistd.h&gt;</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
— это просто список символов, каждый из которых представляет односимвольную опцию. Если за символом следует двоеточие, это означает, что у опции есть ассоциированное значение, которое будет принято как следующий аргумент. Команда
getopt
оболочки bash выполняет аналогичную функцию.

Например, для обработки предыдущего примера можно было бы применить следующий вызов:

getopt(argc, argv, &quot;if:lr&quot;);

В нем учтены простые опции

-i
,
-l
,
-r
и
-f
, за которыми последует аргумент с именем файла. Вызов команды с теми же параметрами, но указанными в другом порядке, изменит поведение. Вы сможете попробовать сделать это, когда получите пример кода из упражнения 4.2.

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