Опции
Как уже говорилось, указания имени достаточно для выполнения некоторых команд. Типичный пример -- команда ls
(от list), предназначенная для просмотра имен файлов (строго говоря, содержимого каталогов). Данная без аргументов, она выводит список имен файлов, составляющих текущий каталог, представленный в некоторой форме по умолчанию, например, в домашнем каталоге пользователя это будет выглядеть примерно так:
$ ls current/ Desktop/ priv/
Исполнение же многих других команд невозможно без указания опций и (или) аргументов. Для них в ответ на ввод одного её имени часто следует не сообщение об ошибке (или не только оно), но и краткая справка по использованию команды. Например, в ответ на ввод команды для создания каталогов mkdir
(от make directory) последует следующий вывод:
usage: mkdir [-pv] [-m mode] directory ...
Для одних опций достаточно факта присутствия в командой директиве, другие же требуют указания их значений (даваемых после опции обычно через знак равенства). В приведённом примере команды mkdir
к первым относятся опции -v
(или --verbose
), предписывающая выводит информацию о ходе выполнения команды (запомним эту опцию -- в том же смысле она используется чуть ли не во всех командах Unix), и -p
, которая позволяет создать любую цепочку промежуточных каталогов между текущим и новообразуемым (в случае их отсутствия).
А вот опция -m
, определяющая атрибуты доступа к создаваемому каталогу, обязательно требует указания значения -- этих самых атрибутов, заданных в символьной форме.
Многие опции имеют две формы -- краткую, односимвольную, и полную, или многосимвольную, Некоторые же опции могут быть даны только в многосимвольной форме. Общее правило здесь таково: если одного символа достаточно для однозначного определения опции, могут употребляться обе формы в качестве равноправных. Однако поскольку количество символов латинского алфавита ограниченно (а человеческая фантазия, конструирующая опции -- безгранична), при большом количестве опций одной команды некоторые из них приходится делать исключительно многосимвольными.
Продемонстрирую это на примере опций все той же команды mkdir
. Полный их список будет следующим:
-m, --mode=MODE установить код доступа (как в chmod) -p, --parents не выдавать ошибок, если существует, создавать родительские каталоги, если необходимо -v, --verbose печатать сообщение о каждом созданном каталоге --help показать помощь и выйти --version вывести информацию о версии и выйти
Очевидно, что для опции --version
краткая форма совпала бы с таковой для опции --verbose
, и потому первая существует только в полной форме. А вот для опции --help
краткая форма в большинстве команд возможна, и она выглядит как -h
. Более того, во многих командах вызов помощи может быть вызван посредством опции -?
. К слову сказать -- приведенный выше список опций команды mkdir
получен именно таким способом.
Раз уж зашла речь об опциях --version
и -h
(--help
, -?
), давайте и их запомним на будущее. Это -- так называемые стандартные опции GNU, в число коих входит и опция -v
, --verbose
. Назначение "длинной" их формы (--version
, --help
, --verbose
) идентично во всех командах, краткой -- во многих.
Опять-таки, из того же примера видно, что опции в односимвольной форме предваряются единичным символом дефиса и могут быть даны единым блоком, без пробелов:
$ mkdir -vpm 777 dir/subdir
При этом, естественно, опция, требующая указания значений, ставится последней, и ее значение отделяется пробелом. Опции же в многосимвольной форме требуют предварения удвоенным дефисом, обязательно должны разделяться пробелами и значения их, если таковые требуются, присваиваются через символ равенства (по научному он называется еще оператором присваивания):
$ mkdir --parents --mode=777 dir/subdir
Загадочные семерки после опции -m
(--mode
) -- это и есть те самые атрибуты доступа, данные в символьной нотации, о которых речь пойдёт в соответствующем разделе.
Опции команды именуются также флагами (реже ключами) или параметрами. Однозначной трактовки этих терминов нет. Однако обычно под флагами подразумеваются опции, не требующие указания значений. Термин параметр же применяется к опции, такового требующей, и объединяет опцию и ее значение. Правда, мне встречалось определение параметра как совокупности опций и аргументов, но я буду придерживаться приведенных определений.
Порядок опций, если их приводится более одной, для большинства команд не существенен. Хотя, например, для команды tar
, создающей файловые архивы, опция -f
, значением которой является имя создаваемого или распаковываемого архива, традиционно указывается последней. И, к слову сказать, именно эта команда -- одна из немногих, опции которой не обязаны предваряться символами дефиса. Так, директивы
$ tar cf filename.tar dir
и
$ tar -cf filename.tar dir
абсолютно равноценны: и та, и другая создает единый архивный файл filename.tar
из отдельных файлов каталога dir
.
Особый смысл имеет символ удвоенного дефиса --
, если после него не следует никакой опции: таким образом обозначается конец списка опций, и все последующие, отделённые пробелом, символы интерпретируются как аргументы (со временем я расскажу, когда это оказывается необходимым). Одинарный же дефис с последующим пробелом, напротив, подменяет аргументы команды, то есть в качестве таковых рассматривается стандартный ввод: знание этого нам потребуется, когда речь дойдёт до командных конвейеров.