Командный интерпретатор. Командный язык системы unix. интерпретатор shell

В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:

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

Интерпретатор SHELL является оболочкой всей операционной системой и выполняет интерфейсные функции между пользователем и ОС. Он перехватывает и интерпретирует все команды пользователя, формирует и выводит ответные сообщения.

Помимо запуска на выполнение стандартных команд UNIX и исполняемых файлов, интерпретатор включает собственный язык, который по своим возможностям приближается к высокоуровневым языкам программирования. Этот язык позволяет создавать программы (shell-файлы, скрипты), которые могут включать операторы языка и команды UNIX. Такие файлы не требуют компиляции и выполняются в режиме интерпретации, но они должны обладать правом на исполнение (устанавливается с помощью команды chmod ).

Общение пользователя с командным интерпретатором осуществляется вводом команд с клавиатуры после появления промпта (приглашения), обычно, символа "$". Введенную последовательность символов интерпретатор будет рассматривать либо как имя внутренней команды, либо как имя исполняемого файла.

Процедуре (скрипту) shell могут быть переданы аргументы при запуске. Каждому из первых девяти аргументов ставится в соответствие позиционный параметр от $1 до $9 ($0 - имя самой процедуры), и по этим именам к ним можно обращаться из текста процедуры.

Прежде, чем начать рассмотрение некоторых операторов shell, следует обратить внимание на использование в командах некоторых символов.

Ниже приведены метасимволы, используемые shell :

* ? - позволяют указывать сокращенные имена файлов при поиске по шаблону;

& - означает, что команда будет выполняться в фоновом режиме;

; - разделяет команды в командной строке;

Отменяет специальное значение символов, таких как *, ?, [, ], &, ;, <,

"..." - отменяют значение пробела как разделителя и специальное значение

всех символов;

"..." - отменяют значение пробела как разделителя и специальное значение всех символов, за исключением $ и;

> - перенаправляет вывод команды в файл;

< - перенаправляет ввод команды из файла;

>> - перенаправляет вывод команды, который должен быть добавлен в

конец существующего файла;

| - создает канал, направляющий вывод одной команды во ввод другой

`...` - используется в паре; позволяет использовать вывод команды как

аргументы в командной строке;

$ - используется с позиционными параметрами и определенными поль-

зователем переменными, также используется по умолчанию в

качестве подсказки shell .

Кроме того, для удобства работы с файлами почти все командные интерпретаторы интерпретируют символы "?" и "*", используя их как шаблоны имен файлов (т.н. метасимволы ):

  • ? - один любой символ;
  • * - произвольное количество любых символов.

Например: *.c - задает все файлы с расширением "c";

pr???.* - задает файлы, имена которых начинаются с "pr", содержат пять символов и имеют любое расширение.

Переменные языка shell

Язык shell позволяет работать с переменными (без предварительного объявления). Имена переменных начинаются с буквы и могут включать буквы и цифры. Обращение к переменным начинается со знака "$".

Пример. Переход к начальному каталогу пользователя: cd $HOME

Оператор присваивания . Присвоение значений переменным осуществляется с помощью оператора `=" без пробелов.

В большинстве операционных систем Linux, bash является принятым по умолчанию интерпретатором командной строки. Для определения текущего интерпретатора введите следующую команду:

$ echo $SHELL
/bin/bash

В этом примере используется интерпретатор командной строки bash. Существует множество других командных интерпретаторов. Для активизации другого интерпретатора можно ввести его имя в командной строке (ksh, tcsh, csh, sh, bash и т.д.).

В большинстве полнофункциональных операционных систем Linux предоставляются на заметку все описанные здесь командные интерпретаторы. Но в небольших операционных системах могут быть предоставлены один или два интерпретатора.

Проверка доступности интересующего интерпретатора командной строки

Самым простым способом проверки доступности интересующего командного интерпретатора является ввод его имени в командной строке. Если интерпретатор запустился, он доступен.

Существует несколько причин для выбора альтернативных командных интерпретаторов.

  • Привычка работать в системах UNIX System V (во многих из них по умолчанию применяются интерпретатор ksh) или в системах компании Sun Microsystems и других системах на базе Berkeley UNIX (в них часто используется csh). В таком случае применение этих интерпретаторов командной строки окажется более удобным.
  • Необходимость запуска сценариев, которые создавались для определенного командного интерпретатора.
  • Возможности альтернативного командного интерпретатора могут оказаться более предпочтительными. Например, один из членов группы пользователей Linux предпочитает применять ksh, так как его не устраивает способ создания псевдонимов в bash.

Хотя большинство пользователей предпочитает работать в одном командном интерпретаторе, полученные навыки помогают научиться работать и в других интерпретаторах командной строки , изредка заглядывая в справочное руководство (например, с помощью команды manbash). Большинство используют bash, так как нет причин переходить на другой интерпретатор.

Использование Bash и ch

Название bash является аббревиатурой от Bourne Again SHell. Эта аббревиатура указывает на то, что bash наследует интерпретатор Bourneshell (команда sh), созданный Стивом Борном (Steve Bourne) из AT&TBell Labs. Брайан Фокс (Brian Fox) из Free Software Foundation создал bash в составе проекта GNU. В дальнейшем разработка перешла в руки Чета Рами (Chet Ramey) в Case Western Reserve University.

Интерпретатор bash содержит возможности, которые разрабатывались для интерпретаторов sh и ksh во времена ранних версий UNIX, а также ряд возможностей интерпретатора csh.

Можно рассчитывать, что в большинстве систем Linux, кроме специализированных (например, встраиваемых или загружающихся с внешнего диска), интерпретатор bash применяется по умолчанию. В специализированных системах может потребоваться командный интерпретатор меньшего объема, что подразумевает и ограничение возможностей.

Большинство примеров в этой статье рассчитано на использование bash.

Интерпретатор bash может запускаться в различных режимах совместимости, имитируя поведение других командных интерпретаторов. Он может имитировать поведение Bourne shell (sh) или командного интерпретатора, совместимого со стандартами POSK (bash — posix).

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

Все предоставляемые операционные системы Linux по умолчанию используют интерпретатор bash, кроме операционных систем, загружаемых со сменных носителей, в которых по умолчанию применяется интерпретатор ash.

Использование tcsh (и более раннего интерпретатора csh)

Командный интерпретатор tcsh является реализацией интерпретатора Сshell (csh) с открытым исходным кодом. Интерпретатор csh был создан Биллом Джоем (Bill Joy) и используется по умолчанию практически во всех системах Berkeley UNIX (такие системы распространялись компанией Sun Microsystems).

Многие возможности csh, например редактирование командной строки и методы управления историей команд, были реализованы в интерпретаторе tcsh и в других командных интерпретаторах. Так же как команда sh запускает интерпретатор bash в режиме совместимости с интерпретатором sh, команда csh запускает интерпретатор tcsh в режиме совместимости с интерпретатором csh.

Использование интерпретатора ash

Интерпретатор ash является облегченной версией интерпретатора Berkeley UNIX sh. Он не содержит многих базовых функций и не предоставляет таких возможностей, как история команд.

Интерпретатор ash хорошо подходит для применения во встраиваемых системах с ограниченными системными ресурсами. В операционной системе FedoraCore 4 интерпретатор ash на порядок меньше интерпретатора bash.

Использование zsh

Интерпретатор zsh является еще одним клоном интерпретатора sh. Он соответствует требованиям стандарта POSIX (как и bash), но обладает другими возможностями, включая проверку орфографии и иной подход к редактированию командной строки. Интерпретатор zsh использовался по умолчанию в первых операционных системах MacOS X, но в современных системах по умолчанию применяется интерпретатор bash.

При работе с FreeBSD, в большинстве случаях для выполнения повседневных задач используется командный интерфейс (так называемый ``шелл""), который принимает команды, которые ему подаются, и выполняет их. Многие командные интерпретаторы имеют встроенные средства выполнения наиболее часто используемых команд, например, операции над файлами и каталогами, редактирование командной строки, командные макросы и переменные окружения. Вместе с FreeBSD поставляется несколько командных интерпретаторов, например, sh, или Bourne Shell, и csh, иначе C-shell. Многие другие, более мощные, например, tcsh или bash, доступны в коллекции портов.Какой из командных интерпретаторов использовать? Это дело вкуса. Если Вы программируете на C, то Вам, возможно, понравится tcsh, а если Вы работали с Linux, то Вас скорее устроит bash, нежели что-либо другое. Каждый из названных интерпретаторов имеет свои особенные свойства, которые отличат его от других и, возможно, повлияют на Ваш выбор.Одна из наиболее часто используемых функций командного интерпретатора - дополнение частичного имени файла до полного. Вы можете набрать только первые несколько символов имени файла, нажать клавишу табуляции (TAB), и командный интерпретатор автоматически Например, у нас есть два фала, названные foobar и foo.bar . Допустим, мы хотим удалить файл foo.bar . Для этого, наберем на клавиатуре rm fo. .Вы увидите следующее: rm foo.bar .Здесь - это так называемый консольный звонок, сигнализирующий о том, что интерпретатор не в состоянии закончить имя файла, так как по введенным Вами символам невозможно однозначно идентифицировать файл. Например, имена файлов foobar и foo.bar оба начинаются с fo , но после нажатия TAB можно однозначно дополнить только до foo . Если же теперь ввести точку (.) и вновь нажать TAB, интерпретатор достроит имя файла целиком.При работе с любым командным интерпретатором, Вы столкнетесь с переменными окружения. Под переменной окружения понимается некоторая строка символов, идентифицируемая некоторым именем. Значение переменных окружения может быть прочитано любо программой, запущенной из командного интерпретатора, и часто содержит конфигурационные настройки для многих приложений и утилит. Ниже приведены некоторые наиболее часто встречающиеся переменные окружения с объяснением их значения:

Переменная Описание USER Имя текущего пользователя. PATH Каталоги, разделенные двоеточием, в которых производить поиск исполняемых файлов. DISPLAY Сетевое имя виртуального дисплея X11, если доступен для подключения. SHELL Текущий командный интерпретатор. TERM Название (тип) терминала. Используется, чтобы узнать возможности терминала. TERMCAP Список escape-последовательностей для управления различными функциями терминала. OSTYPE Название (тип) операционной системы. Например, FreeBSD. MACHTYPE Архитектура машины (процессора). EDITOR Предпочитаемый пользователем текстовый редактор. PAGER Предпочитаемая пользователем утилита просмотра файлов. MANPATH Каталоги, разделенные двоеточием, в которых производить поиск файлов системного справочника.

В зависимости от используемого командного интерпретатора, для просмотра и установки значений переменных окружения служат различные команды. Например, в интерпретаторах csh и tcsh это setenv . В sh и bash это set и export . В частности, чтобы установить или изменить значение переменной EDITOR (в csh или tcsh) равное /usr/local/bin/emacs , выполните команду: setenv EDITOR /usr/local/bin/emacs Если Вы используете bash: export EDITOR="/usr/local/bin/emacs" Чтобы получить значение переменной, например, в командной строке, поместите символ доллара ($) перед именем переменной. Например, команда echo $TERM выведет значение переменной $TERM .Командный интерпретатор воспринимает некоторые символы, называемые метасимволами, в качестве управляющих, несущих специальные функции. Одни из наиболее часто используемых - символ * , который заменяет любое количество символов в имени файла, и? , заменяющий один символ. Эти метасимволы используются для поиска файлов по маске, например, команда echo * выполняет практически тоже самое, что и команда ls , так как под маску * попадают все файлы из текущего каталога (на самом деле, это всегда так и зависит от командного интерпретатора, например, в bash под маску * не попадут файлы, начинающиеся с точки. - скрытые файлы).В некоторых ситуациях требуется, чтобы интерпретатор воспринимал метасимволы как обычные, не несущие специальной смысловой нагрузки. Этого можно достичь, поставив перед символом обратную косую черту (\). Например, команда echo $TERM выведет тип Вашего терминала, в то же время команда echo \$TERM выведет именно слово $TERM , а не значение переменной $TERM .

3.4.1. Как изменить командый интерпретатор по умолчанию

Самым простым, пожалуй, будет воспользоваться командой chsh . Если переменная EDITOR определена, то будет загружен текстовый редактор $EDITOR , иначе vi. Вам нужно будет изменить значение поля ``Shell:"" и выйти из редактора с сохранением результатов.Можно также воспользоваться опцией -s команды chsh . Например: % chsh -s /usr/local/bin/bash
Note: Помните, чтобы использовать некоторую программу в качестве командного интерпретатора, она должна быть обязательно упомянута в файле /etc/shells . Обычно, при установке интерпретаторов из дерева портов, это делается автоматически. Если же это не так, Вам нужно будет самим добавить соответствующую строчку в этот файл.Например, допустим, что Вы установили bash вручную, без использования соответствующего порта, и поместили его в каталог /usr/local/bin . В таком случае, можно набрать: # echo "/usr/local/bin/bash" >> /etc/shells Теперь можно смело использовать команду chsh .

В Linux нет отдельного объекта под именем «система». Система - она на то и система, чтобы состоять из многочисленных компонентов, взаимодействующих друг с другом. Главный из системных компонентов - пользователь. Это он командует машиной, а та его команды выполняет. В руководствах второго и третьего разделов описаны системные вызовы (функции ядра) и библиотечные функции. Они-то и есть непосредственные команды системе. Правда, воспользоваться ими можно только написав программу (чаще всего - на языке Си), нередко - программу довольно сложную. Дело в том, что функции ядра реализуют низкоуровневые операции, и для решения даже самой простой задачи пользователя необходимо выполнить несколько таких операций, преобразуя результат работы одной для нужд другой. Возникает необходимость выдумать для пользователя другой - более высокоуровневый и более удобный в использовании - язык управления системой. Все команды, которые использовал Мефодий в работе, были частью именно этого языка.

Из чего несложно было заключить, что обрабатывать эти команды, превращать их в последовательность системных и библиотечных вызовов должна тоже какая-нибудь специальная программа, и именно с ней непрерывно ведёт диалог пользователь сразу после входа в систему. Так оно и оказалось: программа эта называется интерпретатор командной строки или командная оболочка («shell»). «Оболочкой» она названа как раз потому, что всё управление системой идёт как бы «изнутри» неё: пользователь общается с нею на удобном ему языке (с помощью текстовой командной строки), а она общается с другими частями системы на удобном им языке (вызывая запрограммированные функции).

Таким образом, упомянутые выше правила разбора командной строки - это правила, действующие именно в командном интерпретаторе: пользователь вводит с терминала строку, shell считывает её, иногда - преобразует по определённым правилам, получившуюся строку разбивает на команду и параметры, а затем выполняет команду, передавая ей эти параметры. Команда, в свою очередь, анализирует параметры, выделяет среди них ключи, и делает что попросили, попутно выводя на терминал данные для пользователя, после чего завершается. По завершении команды возобновляется работа «отступившего на задний план» командного интерпретатора, он снова считывает командную строку, разбирает её, вызывает команду... Так продолжается до тех пор, пока пользователь не скомандует оболочке завершиться самой (с помощью logout или управляющего символа « ^D », который для shell значит то же, что и для других программ: больше с терминала ввода не будет).

Конечно, командных интерпретаторов в Linux несколько. Самый простой из них, появившийся в ранних версиях UNIX, назывался sh , или «Bourne Shell» - по имени автора, Стивена Борна (Stephen Bourne). Со временем его - везде, где только можно - заменили на более мощный, bash , «Bourne Again Shell».

Игра слов: «Bourne Again» вслух читается как «born again», т. е. «возрождённый».

bash превосходит sh во всём, особенно в возможностях редактирования командной строки. Помимо sh и bash в системе может быть установлен «The Z Shell», zsh , самый мощный на сегодняшний день командный интерпретатор (шутка ли, 22 тысячи строк документации), или tcsh , обновлённая и тоже очень мощная версия старой оболочки «C Shell», синтаксис команд которой похож на язык программирования Си.

Когда Гуревич добавлял учётную запись Мефодия в систему, он не стал спрашивать того, какой командный интерпретатор ему нужен, потому что знал: для новичка имя командного интерпретатора - пустой звук. Тем не менее имя оболочки, запускаемой для пользователя сразу после входа в систему - т. н. стартовый командный интерпретатор (login shell), - это часть пользовательской учётной записи, которую пользователь может изменить командой chsh (change shell).

Какая бы задача, связанная с управлением системой, ни встала перед пользователем Linux, она должна иметь решение в терминах командного интерпретатора. Фактически, решение пользовательской задачи - это описание её на языке shell. Язык общения пользователя и командного интерпретатора - это высокоуровневый язык программирования, дополненный, с одной стороны, средствами организации взаимодействия команд и системы, а с другой стороны - средствами взаимодействия с пользователем, облегчающими и ускоряющими работу с командной строкой.

Иллюстрация 2. Интерфейс командной строки. Издание второе, переработанное и дополненное. Взаимодействие пользователя с компьютером посредством терминала и оболочки.

Команды и утилиты

$ apropos s . . . (четыре с половиной тысячи строк!)

Пример 18 . Бессмысленная команда

Одного неудачного запуска apropos Мефодию было достаточно для того, чтобы понять: команд в Linux очень много. Ему пришло в голову, что никакая программа - пусть даже и оболочка - не может самостоятельно разбираться во всех задокументированных командах. Кроме того, Гуревич называл большинство команд утилитами , то есть полезными программами. Стало быть, командный интерпретатор не обязан уметь выполнять всё, что вводит пользователь. Ему достаточно разобрать командную строку, выделить из неё команду и параметры, а затем запустить утилиту - программу, имя которой совпадает с именем команды.

В действительности собственных команд в командном интерпретаторе немного. В основном это - операторы языка программирования и прочие средства управления самим интерпретатором. Все знакомые Мефодию команды, даже echo , существуют в Linux в виде отдельных утилит. shell занимается только тем, что подготавливает набор параметров в командной строке (например, раскрывая шаблоны ), запускает программы и обрабатывает результаты их работы.

$ type info info is /usr/bin/info $ type echo echo is a shell builtin $ type -a echo echo is a shell builtin echo is /bin/echo $ type -a -t echo builtin file $ type -a -t date file $ type -at cat file

Пример 19 . Определение типа команды

В bash тип команды можно определить с помощью команды type . Собственные команды bash называются builtin (встроенная команда), а для утилит выводится путь , содержащий название каталога, в котором лежит файл с соответствующей программой, и имя этой программы. Некоторые - самые нужные - команды встроены в bash , даже несмотря на то, что они имеются в виде утилит (например, echo). Работает встроенная команда так же, но так как времени на её выполнение уходит существенно меньше, командный интерпретатор выберет именно её, если будет такая возможность. Ключ « -a » («a ll», конечно), заставляет type вывести все возможные варианты интерпретации команды, а ключ « -t » - вывести тип команды вместо пути.

По совету Гуревича Мефодий сгруппировал ключи, написав « -at » вместо « -a -t ». Многие утилиты позволяют так делать, уменьшая длину командной строки. Если встречается параметрический ключ, он должен быть последним в группе, а его значение - следовать, как и полагается, после. Группировать можно только однобуквенные ключи.

Слова и разделители

При разборе командной строки shell использует понятие разделитель (delimiter). Разделитель - это символ, разделяющий слова; таким образом командная строка - это последовательность слов (которые имеют значение) и разделителей (которые значения не имеют). Для shell разделителями являются символ пробела, символ табуляции и символ перевода строки (который всё-таки может попасть между словами способом, описанным в лекциях Работа с текстовыми данными и Возможности командной оболочки). Количество разделителей между двумя соседними словами значения не имеет.

Первое слово в тройке передаётся команде как первый параметр, второе - как второй и т. д. Для того, чтобы разделитель попал внутрь слова (и получившаяся строка с разделителем передалась как один параметр), всю нужную подстроку надо окружить одинарными или двойными кавычками:

$ echo One Two Three One Two Three $ echo One "Two Three" One Two Three $ echo "One > > Ой. И что дальше? > А, кавычки забыл!" One Ой. И что дальше? А, кавычки забыл! $

Пример 20 . Закавычивание в командной строке

В первом случае команде echo было передано три параметра - « One », « Two » и « Three ». Она их и вывела, разделяя пробелом. Во втором случае параметров было два: « One » и « Two Three ». В результате эти два параметра были также выведены через пробел. В третьем случае параметр был всего один - от открывающего апострофа « "One » до закрывающего « ...забыл!" ». Всё время ввода bash услужливо выдавал Мефодию подсказку « > » - в знак того, что набор командной строки продолжается, но в режиме ввода содержимого кавычек.

Драйверы символьных устройств

При вводе команды поток символов в первую очередь интерпретируется драйвером символьного устройства. Какой именно драйвер работает, в каждом случае зависит от используемого оборудования (более подробные сведения см. в «Описании программы. Часть 1. Справочник по утилитам» КПДА.10964-01 13 01).

Примечание . Обработка нажатий некоторых клавиш может отличаться от описанной в этом разделе в зависимости от конфигурации системы.

Режимы ввода

Драйверы устройств символьного ввода/вывода могут функционировать либо в режиме необрабатываемых ("сырых") входных данных (raw input mode), либо в каноническом режиме (canonical mode), или режиме редактируемых входных данных (edited input mode). В режиме "сырых" входных данных все символы передаются приложению по мере их ввода. В режиме редактируемых входных данных приложение получает символы только после завершения ввода всей строки (о чем, как правило, свидетельствует символ возврата каретки).

Поддержка терминалов

Некоторым программам (например, vi) требуется информация о том, какие действия может выполнять ваш терминал (возможно ли перемещение курсора, очистка экрана и т. д.). Переменная окружения TERM указывает на тип используемого терминала, а каталог /usr/lib/terminfo представляет собой базу данных терминалов. В этом каталоге содержится набор подкаталогов (от a до z), в которых хранится информация для соответствующего терминала. Некоторые приложения вместо каталога /usr/lib/terminfo используют каталог /etc/termcap, представляющий собой устаревшую однофайловую модель базы данных.

Терминалом по умолчанию является qansi-m (QNX-версия терминала ANSI). Более подробные сведения об установке типа терминала см. в подразд. "Типы терминалов" раздела 9.

Служба telnet

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

Примечание . При запуске telnet из ОС Windows пользуйтесь режимом ansi или vt100, в зависимости от типа терминала.

Общие сведения о клавиатуре

В табл. 4.1 указано, как драйверы устройств символьного ввода/вывода интерпретируют нажатия различных клавиш и их сочетаний (т. е. групп одновременно нажатых клавиш). Драйверы обрабатывают нажатия клавиш сразу после их выполнения.

Примечание . Отклик системы на работу пользователя с клавиатурой может отличаться от описанного далее, если:




Top