Основной синтаксис командной строки Linux

Основой интерфейса командной строки UNIX является командный интерпретатор (КИ), являющийся первой и главной программой, запускаемой в сеансе пользователя.

 

Двусторонний попеременный диалог с командным интерпретатором начинается с приглашения, в ответ на которое пользователь вводит команду, отправляя ее на выполнение управляющим символом LF 0х0А, получает результат ее исполнения на терминале и новое приглашение, сигнализирующее о готовности КИ к исполнению очередной команды.

$   command   -х    [-у]    -z    optarg   { — l |  —long-option}   arg1  arg2  . . .

Многие другие диалоговые программы, например lftp, так же будут придерживаться синтаксиса и соглашений, принятых в языке командного интерпретатора.

Базовый синтаксис (подчиняющийся второй части стандарта W: [POSIX]) языка любого командного интерпретатора на самом деле достаточно прост и напоминает язык, близкий к естественному.

Например, rm  -f  -R Изображения Музыка переводится на человеческий как «удалить (rm) без шума и пыли (-f) и со всеми потрохами (-R) каталоги Изображения и Музыка».

Принято говорить, что команда состоит из лексем (лексических элементов), разделенных пробельными символами — пробелами SP 0x20 и табуляциями HT 0x09 — в любом количестве и сочетании.

Первая лексема —  это название команды, за которой следуют ее параметры: сначала опции (они же — ключи, они же — модификаторы) без аргументов (-х    [-у]) и (—long-option) или с аргументами (optarg ), а в конце— аргументы ( arg1  arg2) самой команды.

Название команды — это глагол, указывающий ЧТО делать; опции — это наречия и прочие части речи, объясняющие КАК это делать; и наконец, аргументы задают то, с ЧЕМ это делать. В разнообразной документации при описании синтаксиса команды, ее опций и аргументов принято использовать квадратные скобки для указания необязательности опции или аргумента, фигурные скобки и вертикальную черту для указания выбора из вариантов и многоточие для указания повторяемости.

Получив команду, интерпретатор определяет, является ли она псевдонимом, встроенной в интерпретатор, или реализуется внешней программой, подлежащей запуску.

Утилиты which и type

john@ubuntu: ~$ which date

/bin/date

john@ubuntu: ~$ type date

date является /bin/date

john@ubuntu: ~$ type -a ls

ls является алиасом для ‘ls  —color=auto’

ls является /bin/ls

john@ubuntu: ~$ type -a pwd

pwd встроена в оболочку

pwd является /bin/pwd

john@ubuntu: ~$ type which

which является /usr/bin/which

john@ubuntu: ~$ type type

type встроена в оболочку

При наличии нескольких вариантов команды наивысший приоритет имеют псевдонимы, наименьший — внешние команды. Подстановку псевдонимов можно увидеть, включив трассировку выполнения команд интерпретатора при помощи команды set.

Подстановка псевдонимов

john@ubuntu:~$ type ls

Is является алиасом для ‘ls  —color=auto’

john@ubuntu: ~$ set -x

john@ubuntu: ~$ Is -ASs

+   ls   —color=auto   -ASs

итого 36
12   examples.desktop         4 .bashrc               4 .profile             4 .lesshst
4 .cache                                  4 .bash_history   4 .bash_logout

В примере с командой m лексема -R означает опцию, требующую выполнить рекурсию (recursion), но не аргумент — объект, подлежащий удалению. В примере с командой m лексема -R означает опцию, требующую выполнить рекурсию (recursion), но не аргумент — объект, подлежащий удалению.

Опции командной строки

В истории развития операционной системы UNIX программы использовали разные способы задания своих опций:
♦ односимвольные, например ls -а -l (что эквивалентно ls -l -а или ls -al или ls -la);
♦ многосимвольные, например find /var  -xdev;
♦ длинные, например ps  —help;
♦ с аргументами, например kill  -n  15 1, или kill  -n15  1, или du  -В  M, или  du -BM,

или find /etc -type d, или даже ls —sort=slze;

♦ «нестандартные», например set +x,  tar  czf tar.tgz ~ или dd  if=/dev/dvd  of=dvd.iso.

Знак «минус», предваряющий опции, естественно используется для того, чтобы отличать их от аргументов. Среди прочих, он был выбран потому, что редко встречается как первый символ в аргументах команд (в качестве которых зачастую выступают имена файлов).

И еще потому, что на терминале классической UNIX набор более логичного знака «плюс» (что могло бы означать «включить»,«активировать») требовал достаточных усилий по нажатию клавиши SHIFT. В результате получилось, что, например, в команде set опция х (execution trace) в форме -х включает, а +х выключает трассировку выполнения команд.

В тех редких случаях, когда аргумент команды все же начинается с символа «минус» и тем самым похож на опцию (представим, что нужно выполнить действие над файлом с именем -=filenames=-), специальная опция — сигнализирует о конце списка опций, за которым следуют лексемы, обязанные расцениваться как аргументы, вне зависимости от их написания.

Конец списка опций

john@ubuntu: ~$ stat -=filename=-

stat: неверный ключ —  «=»
Попробуйте «stat —help» для получения более подробного описания.

john@ubuntu: ~$ stat  — —  -=filename=-

Файл: «-=filename=-»
Размер:  0                         Блоков: 0                     Блок B/B: 4096         пустой обычный файл
Устройство: fc00h/64512d                  Inode: 26870044            Ссылки: 1
Доступ: (0600/-rw -)                      Uid: (  1000/    john)                Gid: ( 1000/     john)
Доступ: 2018-08-24    01:37:21.574640275 +0300

Модифицирован: 2018-08-24 01:37:21.574640275 +0300

Изменён: 2018-08-24 01:37:21.574640275 +0300

Создан: —

Короткие, односимвольные опции (например -l -а) без своих аргументов издревле можно было объединять в группы (-lа или -al), однако их в этом случае сложно отличать от многосимвольных (-xdev) или односимвольных, склеенных со своими аргументами (-ВМ).

Поэтому позже появились длинные (в так называемом GNU-стиле) опции, обозначаемые двумя знаками «минус», позволяющие навести некоторый порядок в виде —block-size=M вместо -ВМ или, предположим,

—dont-descent вместо -xdev.

Командный интерфейс Linux

Командный интерфейс Linux, каким бы «страшным» не казался, в реальности удивительно функционален для решения массы разнообразных задач, хотя он и не решает абсолютно все задачи одинаково эффективно. Например, его невероятно сложно и неудобно использовать для обработки графической информации, когда при взаимодействии с пользователем требуется ввести колоссальное количество «графических» данных, например, указать обтравочный контур. В этом случае графический интерфейс с «непосредственным» манипулированием подойдет гораздо лучше.

Для начинающего пользователя интерфейс командной строки действительно является непривычным, что зачастую путают с неудобством, так толком и не разобравшись со всеми его возможностями.

Естественные языки, которые используют люди для взаимодействия между собой, на порядок сложнее формального командного языка операционной системы. Однако использование глаголов (команд), существительных (аргументов) и наречий (опций) родного языка мало у кого вызывает чувство неудобства. Наоборот, странным покажется тот человеческий индивидуум, который попытается в обществе использовать непосредственное манипулирование, например, указывая (щелкая) пальцем в магазине на товары (значки) и мыча что-то нечленораздельное. Скорее всего, мы примем его за иностранца (или это будет ребенок), еще не в полной мере владеющего языком.

Именно командный интерфейс в современном виде — аудиоформе — больше не является уделом художественных фантастических произведений, где капитаны межгалактических кораблей командуют кораблям «включить защитное поле». Теперь мы все можем при помощи командного аудиоинтерфейса смартфона найти ближайшую пиццерию или маршрут к нужному месту. Надеюсь, что и алфавитно-цифровая форма командного интерфейса, доставшаяся «в наследство» от UNIX из 70-х годов прошлого века, вас тоже не особо испугает. Ok, Google?

Добавить комментарий