Основой интерфейса командной строки 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?