Работая в системе и изучая руководства, Мефодий заметил, что параметры команд можно отнести к двум различным категориям. Некоторые параметры имеют собственный смысл: это имена файлов, названия разделов и объектов в man и info, числа и т. п. Другие параметры собственного смысла не имеют, их значение можно истолковать, лишь зная, к какой команде они относятся. Например, параметр «-a» можно передать не только команде man, но и команде who, и команде last, при этом значить для них он будет разное. Такого рода параметры называются модификаторами выполнения или ключами (options).
[methody@localhost methody]$ date
Вск Сен 19 23:01:17 MSD 2004
[methody@localhost methody]$ date -u
Вск Сен 19 19:01:19 UTC 2004
Пример 13. Команда date с ключом
Для решения разных задач одни и те же действия необходимо выполнять слегка по-разному. Например, для синхронизации работ в разных точках земного шара лучше использовать единое для всех время (по Гринвичу), а для организации собственного рабочего дня — местное время (с учётом сдвига по часовому поясу и разницы зимнего и летнего времени). И то, и другое время показывает команда date, только для работы по Гринвичу ей нужен дополнительный параметр-ключ «-u» (он же «--universal»).
Однобуквенные ключи
Для формата ключей нет жёсткого стандарта, однако существуют договорённости, нарушать которые в наше время уже неприлично.
Во-первых, если параметр начинается на «-», это — однобуквенный ключ. За «-», как правило, следует один символ, чаще всего — буква, обозначающая действие или свойство, которое этот ключ придаёт команде. Так проще отличать ключи от других параметров — и пользователю при наборе командной строки, и программисту, автору команды.
Во-вторых, желательно, чтобы имя ключа было значащим — как правило, это первая буква названия пресловутого действия или свойства. Например, ключ «-a» в man и who происходит от слова «All» (всё), и изменяет работу этих команд так, что они начинают показывать информацию, о которой они обычно умалчивают. А в командах cal и who смысл ключа «-m» — разный:
[methody@localhost methody]$ who -m
methody tty1 Sep 20 13:56 (localhost)
[methody@localhost methody]$ cal -m
Сентября 2004
Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Пример 14. Использование ключа «-m» в разных командах
Для who ключ «-m» означает «Me», то есть «Я», и в результате who работает похоже на whoami.
Кстати, с незапамятных времён who поддерживает один нестандартный набор параметров: who am i делает то же, что и who -m.
А для cal ключ «-m» — это команда выдать календарь, считая первым днём понедельник («Monday»), как это принято в России.
Свойство ключа быть, с одной стороны, предельно коротким, а с другой стороны — информативным, называется аббревиативностью. Не только ключи, но и имена наиболее распространённых команд Linux обладают этим свойством.
В-третьих, иногда ключ изменяет поведение команды таким образом, что меняется и толкование параметра, следующего в командной строке за этим ключом. Выглядит это так, будто ключ сам получает параметр, поэтому ключи такого вида называются параметрическими. Как правило, их параметры — имена файлов различного применения, числовые характеристики и прочие значения, которые нужно передать команде.
[methody@localhost methody]$ info info "Expert info" Cross-refs Help-Cross -o text
info: Запись ноды (info.info.bz2)Help-Cross...
info: Завершено.
[methody@localhost methody]$ cat text -n
1 File: info.info, Node: Help-Cross, Up: Cross-refs
2
3 The node reached by the cross reference in Info
4 -----------------------------------------------
. . .
Пример 15. Использование info -o
Здесь info запустилась не в качестве интерактивной программы, а как обработчик info-документа. Результат работы — текст узла info -> Expert info -> Cross-refs -> Help-Cross, программа поместила в файл text.
Странное слово «нода» Мефодий решил оставить на совести неизвестного переводчика сообщений info.
А программа cat вывела содержимое этого файла на терминал, пронумеровав все строки (по просьбе ключа «-n», «number»).
Теперь стало более-менее понятно, что означают неудобочитаемые строки в поле SYNOPSIS руководства. Например [-smjy13] из руководства по cal ($ManCal) говорит о том, что команду можно запускать с необязательными ключами «-s», «-m», «-j», «-y», «-1» и «-3».
В-четвёртых, есть некоторые менее жёсткие, но популярные договорённости о значении ключей. Ключ «-h» («Help») обычно (но, увы, не всегда) заставляет команды выдать краткую справку (нечто похожее на SYNOPSIS, иногда с короткими пояснениями). Если указать «-» вместо имени выходного файла в соответствующем параметрическом ключе (нередко это ключ «-o»), вывод будет производиться на терминал.
Точнее, на стандартный вывод, см. лекцию Работа с текстовыми данными.
Наконец, бывает необходимо передать команде параметр, а не ключ, начинающийся с «-». Для этого нужно использовать ключ «--»:
[methody@localhost methody]$ info -o -filename-with-
info: Запись ноды (dir)Top...
info: Завершено.
[methody@localhost methody]$ head -1 -filename-with-
head: invalid option -- f
Попробуйте `head --help' для получения более подробного описания.
[methody@localhost methody]$ head -1 -- -filename-with-
File: dir Node: Top This is the top of the INFO tree
Пример 16. Параметр-не ключ, начинающийся на «-»
Здесь Мефодий сначала создал файл -filename-with-, а потом пытался посмотреть его первую строку (команда head -количество_строк имя_файла выводит первые количество_строк из указанного файла). Ключ «--» (первый «-» — признак ключа, второй — сам ключ) обычно запрещает команде интерпретировать все последующие параметры командной строки как ключи, независимо от того, начинаются ли они на «-» или нет. Только после «--» head согласилась с тем, что -filename-with- — это имя файла.
Полнословные ключи
Аббревиативность ключей трудно соблюсти, когда их у команды слишком много. Некоторые буквы латинского алфавита (например, «s» или «o») используются очень часто, и могли бы служить сокращением сразу нескольких команд, а некоторые (например, «z») — редко, под них и название-то осмысленное трудно придумать. На такой случай существует другой, полнословный формат: ключ начинается на два знака «-», за которыми следует полное имя обозначаемой им сущности. Таков, например, ключ «--help» (аналог «-h»):
[methody@localhost methody]$ head --help
Использование: head [КЛЮЧ]... [ФАЙЛ]...
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.
Аргументы, обязательные для длинных ключей, обязательны и для коротких.
-c, --bytes=[-]N print the first N bytes of each file;
with the leading `-', print all but the last
N bytes of each file
-n, --lines=[-]N print the first N lines instead of the first 10;
with the leading `-', print all but the last
N lines of each file
-q, --quiet, --silent не печатать заголовки с именами файлов
-v, --verbose всегда печатать заголовки с именами файлов
--help показать эту справку и выйти
--version показать информацию о версии и выйти
N may have a multiplier suffix: b 512, k 1024, m 1024*1024.
Об ошибках сообщайте по адресу <bug-coreutils@gnu.org>.
Пример 17. Ключ–help
Мефодий сделал то, о чём просила его утилита head. Видно, что некоторые ключи head имеют и однобуквенный, и полнословный формат, а некоторые — только полнословный. Так обычно и бывает: часто используемые ключи имеют аббревиатуру, а редкие — нет. Значения параметрических полнословных ключей принято передавать не следующим параметром командной строки, а с помощью конструкции «=значение» непосредственно после ключа.