Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_1_6_Обработка командной строки.doc
Скачиваний:
7
Добавлен:
21.09.2019
Размер:
73.73 Кб
Скачать

5

ОБРАБОТКА КОМАНДНОЙ СТРОКИ

Аргументы и опции командной строки

Первая задача любой программы – интерпретация опций и аргументов командной строки. Общая идея при создании программ – предоставление всех необходимых возможностей через аргументы командной строки для предоставления точного режима ISO или POSIX.

Аргументы все слова командной строки, за исключением имени команды. Например:

ls file*.txt

echo $HOME

саt file1 file2 file3

Аргументы друг от друга отделены разделителями (пробел или TAB). Если аргумент является строкой, то кавычки " " позволяют включать в эту строку строки разделители:

echo "hear are lots of spaces "

echo hear are lots of spaces

здесь в 1-м слове все пробелы при выводе сохранятся, во 2-м – останется по одному пробелу.

(В оболочке двойные и одинарные кавычки различаются. но сейчас в лекции речь об оболочке не идет).

Аргументы можно подразделить далее на опции и операнды. В трех первых примерах все аргументы были операндами: файлы для ls и cat, переменная для echo.

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

В традиционных UNIX-системах опции являются “короткими”, начинаются с символа минус и состоят из единственной буквы:

ls – l file*.txt

echo – n "введите х: "

Утилиты GNU должны поддерживать помимо “коротких” ещё и “длинные” опции:

gawk -- field-separator = : ….

cp - - help

ls - - version

Аргументы опции (аргументы для опции) являются информацией, необходимой для опции, в отличие от обычных аргументов-операндов. Например, опция -f программы fgrep означает «использовать содержимое следующего файла в качестве списка строк для поиска»:

и мя команды

опция

аргумент опции

операнды

fgrep -f patfile foo.c bar.c baz

Рис.1. Компоненты командной строки

Таким образом, patfile не является файлом данных для поиска, а предназначен для хранения списка строк, которые программа fgrep будет искать в файлах foo.c, bar.c, baz.

Соглашения posix

Стандарт POSIX описывает ряд соглашений, которых придерживаются удовлетворяющие стандарту программы. Никто не требует, чтобы программы удовлетворяли этим стандартам, но это является хорошим тоном в программировании: пользователи Linux и UNIX всему миру понимают и используют эти соглашения. Более того, функции, с которыми мы познакомимся далее ( getopt ( ) и getopt_long( ) ), освобождают программиста от бремени ручного разбора аргументов для каждой программы, которую он напишет. Вот эти правила, перефразированные из стандарта:

  1. В имени программы должно быть не менее двух и не более девяти символов.

  2. Имена программ должны содержать лишь строчные символы и цифры.

  3. Имя опции должно быть простым буквенно-цифровым символом. Опции с множеством цифр не должны допускаться. Для производителей, реализующих утилиты POSIX, опция -w зарезервирована для специфичных для производителя опций.

  4. Все опции должны начинаться с символа '-'.

  5. Для опций, не требующих аргументов, должно быть возможно объединение нескольких опций после единственного символа '-'. (Например, 'foo -a -b -с' и 'foo -abc' должны интерпретироваться одинаково.)

  6. Когда опции все же требуется аргумент, он должен быть отделен от опции пробелом (например, 'fgrep -f patf ile'). Однако стандарт допускает историческую практику, при которой иногда опция и ее операнд могут находиться в одной строке: 'fgrep -fpatfile'. На практике функции getopt(3) ngetopt_long(3) интерпретируют '-fpatfile' как '-f patfile', а не как'-f -p -a -t . . . .

  1. Аргументы опций не должны быть необязательными.Это означает, что если в документации программы указано, что опции требуется аргумент, этот аргумент должен присутствовать всегда, иначе программа потерпит неудачу. GNU getopt(3) все же предусматривает необязательные аргументы опций, поскольку иногда они полезны.

  2. Если опция принимает аргумент, который может иметь несколько значений, программа должна получать этот аргумент в виде одной строки со значениями, разделенными запятыми или разделителем.

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

myprog -u "arnold, joe, jane" /* разделение запятыми */

myprog -u "arnold joe jane" /* разделение пробелами */

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

  1. Опции должны находиться в командной строке первыми, перед операндами. Версии getopt(3) UNIX проводят в жизнь это соглашение. GNU getopt (3) по умолчанию этого не делает, хотя можно настроить его на это.

  2. Специальный аргумент '--' указывает на окончание всех опций. Все последующие аргументы командной строки рассматриваются как операнды, даже если они начи­наются с черточки.

  3. Порядок, в котором приведены опции, не должен играть роли. Однако, для взаимно исключающих опций, когда одна опция перекрывает установки другой, тогда (так сказать) последняя побеждает. Если опция, имеющая аргумент, повторяется, программа должна обработать аргументы по порядку. Например, 'myprog -u arnold -u jane' to же самое, что и 'myprog -u "arnold, jane"'. (программисту придется осуществить это самостоятельно; getopt( ) не поможет.)

  4. Нормально, когда порядок аргументов имеет для программы значение. Каждая про­грамма должна документировать такие вещи.

  5. Программы, читающие или записывающие именованные файлы, должны трактовать единственный аргумент ‘-’ как означающий стандартный ввод или стандартный вывод, в зависимости от того, что подходит программе.

Многие стандартные программы не следуют всем указанным соглашениям. Главной причиной является историческая совместимость; многие такие программы предшествовали систематизации этих соглашений.