Работая в системе и изучая руководства, Мефодий заметил, что параметры команд можно отнести к двум различным категориям. Некоторые параметры имеют собственный смысл: это имена файлов, названия разделов и объектов в 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
имеют и однобуквенный, и полнословный формат, а некоторые — только полнословный. Так обычно и бывает: часто используемые ключи имеют аббревиатуру, а редкие — нет. Значения параметрических полнословных ключей принято передавать не следующим параметром командной строки, а с помощью конструкции «=значение
» непосредственно после ключа.