Первый в мире командный процессор был написан в 1976 году Стивеном Борном из Bell Labs и входил в UNIX Version 7; Bourne shell часто называют sh по имени исполняемого файла. Через некоторое время в Беркли Биллом Джоем был написан C-shell (csh), впоследствии он же написал редактор vi, был одним из авторов первой версии BSD UNIX и входил в число основателей Sun Microsystems.
В конце 1970-х годов был написан tcsh - расширение csh, совместимое с ним по командам и синтаксису языка скриптов.
Позднее появились Bourne again shell (bash), разработанный в рамках проекта GNU, и Korn shell (ksh) Дэвида Корна.
Командный процессор нужен для интерпретации команд пользователя, запуска программ, выполнения скриптов, заданий и некоторых других задач. В Solaris устанавливаются несколько командных процессоров, но командным процессором по умолчанию является sh.
Командный процессор запускается либо при входе пользователя в систему (login shell), либо из какой-то программы (в т.ч. из другого командного процессора). Каждый командный процессор при запуске пытается выполнить свои стартовые файлы, вначале системные, а затем пользовательские. Общие файлы находятся в /etc, а индивидуальные – в домашнем каталоге. Если командный процессор запускается при входе пользователя в систему, то после стартовых файлов он выполняет еще и login-файлы в том же порядке. (В некоторых процессорах сначала выполняются login-файлы.) Стартовые файлы представляют собой скрипты на языке командного процессора и служат для инициализации среды окружения.
Например, если bash запущен как login shell, то он выполняет /etc/profile, если такой файл существует. Затем осуществляется попытка выполнить ~/.bash_profile. Если такого файла нет, bash пытается выполнить файл ~/.bash_login, а если нет и его, то выполняется ~/.profile. Если bash запущен не как login shell, то при старте он выполняет только файл ~/.bashrc.
| shell | Стартовые файлы | login-файлы |
|---|
| sh | /etc/profile, ~/.profile |
| csh | /etc/csh.cshrc, ~/.cshrc | /etc/csh.login, ~/.login |
| ksh | | /etc/profile, ~/.profile |
| bash | ~/.bashrc | /etc/profile, ~/.bash_profile ~/.profile |
Во время работы командный процессор хранит историю команд в памяти, а по окончании работы записывает их в файл. Файл истории команд хранится в домашнем каталоге пользователя. В sh, csh, tcsh он называется ~/.history, в bash – ~/.bash_history, в ksh – ~/.shhistory, а в public domain Korn shell – pdksh его не существует (можно создать).
Файл истории команд ограничен по размеру, но можно изменить число хранимых команд, задав другое значение соответствующей переменной (sh, ksh – HISTSIZE, csh – history, bash – HISTFILESIZE). Нужно учитывать, что довольно часто sh не создает файл .history и дает доступ только к командам, которые были введены в течение текущего сеанса.
Переменные среды окружения
Для использования значения переменной в командном процессоре применяется конструкция
$имя переменной
Присвоение переменной значения во всех командных процессорах, кроме csh, выполняется командой
VAR=value
В csh команда иная:
set VAR=value
или
setenv VAR value
Переменные могут экспортироваться, т.е. передаваться от процессов-родителей процессам-потомкам. Для экспорта переменной требуется команда
export имя переменной
Если требуется удалить переменную среды окружения, можно присвоить ей пустое значение (иногда этого достаточно), а можно удалить командой unset.
В tsch есть возможность создавать переменные только для чтения, без права изменения значений:
set –r имя=значение
Также в tcsh можно присвоить переменной значение в виде списка слов, к которым потом можно обращаться по номеру слова, начиная с 1:
set var=(TENEX C Shell)
echo {$var[1]}
TENEX
echo {$var[2]}
C
echo {$var[3]}
Shell
Для вывода на экран списка всех переменных и их значений применяется команда set без параметров.
Предопределенные переменные
Предопределенные переменные содержатся в среде окружения. Имена предопределенных переменных среды окружения во всех командных процессорах, кроме csh (и в некоторых случаях tcsh) пишутся символами верхнего регистра: PATH, USER, TERM, PS1, PS2.
| Переменная | Что она означает |
|---|
| HOME | Домашний каталог |
| SHELL | Командный процессор по умолчанию |
| PS1 | Вид приглашения shell'a |
| PS2 | Вид приглашения "продолжение команды" |
| TERM | Тип терминала пользователя |
| USER | Имя пользователя |
| PATH | Список каталогов, где нужно искать исполняемый файл, когда пользователь запускает программу, указывая только ее название. Каталоги разделяются двоеточиями |
Могут быть определены и другие переменные:
$ - номер процесса текущего shell'a,
* - все позиционные параметры,
_ - последняя вызванная команда,
1,2,...,9 - один позиционный параметр,
? - число позиционных параметров.
Псевдонимы команд
Назначить псевдоним очень просто:
alias псевдоним команда
Команда может быть последовательностью команд с ключами и аргументами, тогда ее следует заключить в апострофы:
alias псевдоним 'команда' (csh)
или
alias псевдоним='команда' (другие)
Псевдонимы могут передаваться запускаемым из данного сеанса другим командным процессорам.
Отмена назначенного псевдонима выполняется командой
unalias псевдоним
Повторение и изменение команд
Вариант, доступный в csh, tcsh и bash:
^x^y
Эта конструкция требует от командного процессора повторить предыдущую команду, заменив сначала x на y.
В csh, tcsh, bash имеются и другие средства модификации командной строки:
!n (n – число) – повтор n-ной команды из истории команд,
!! – повтор последней команды,
!str – выполнение последней команды, начинающейся на str.
Командные процессоры csh и tcsh по-разному интерпретируют конструкцию !nstr, например, `!2r'. Для csh это команда №2, в конец которой добавляется r перед выполнением, а для tcsh – последняя начинающаяся на 2r команда. Чтобы заставить tcsh вести себя подобно csh, нужно перед числом поставить обратный слэш, экранирующий его специальное значение: `!\2r'.
В bash повторение команд выполняется так же, как и в csh. В ksh для повторения команд используют команду r, а в sh – команду fc, при этом в sh можно вызвать только команду, введенную в текущем сеансе (если нет файла истории).
Также в bash можно вызвать встроенный интерактивный поиск в истории команд, нажав <Ctrl-R> и затем введя подстроку для поиска; найденная команда отобразится автоматически.
Шаблоны
Командный процессор распознает и интерпретирует следующие символы в шаблонах (метасимволы, metasymbols или wildcards):
*- любая подстрока, в т.ч. пустая,
? - один любой символ,
[...] - один символ из списка (например, [aghbnm]) или диапазона (например, [a-z]).
Команда, заключенная в ` ` (обратные апострофы), выполняется первой, а результат ее выполнения подставляется в командную строку. Затем командная строка запускается на выполнение.
Командный процессор "не понимает" регулярных выражений, хотя шаблоны и похожи на них. Для обработки регулярных выражений в любом приложении используется функция regex.
Функция "завершения" имен файлов (file name completion) позволяет набрать только часть имени существующего файла и затем нажать клавишу <Tab>. В ответ на это командный процессор "закончит" набор имени файла. Завершение имен файлов реализовано только в bash и tcsh.
При двойном нажатии <Tab> выводятся все возможные варианты завершения имени файла.
Средства редактирования командной строки
В sh нельзя передвинуть курсор в любую позицию в строке, в остальных командных процессорах – можно. В любом командном процессоре реализованы стирание последнего символа клавишей
и стирание строки полностью комбинацией клавиш .
В bash и tcsh можно перемещаться по строке с помощью стрелок, вводить знаки в середину и в начало строки. Командный процессор bash после нажатия Enter принимает всю строку полностью, независимо от того, в какой позиции строки находился курсор при нажатии. В ksh редактирование по умолчанию выключено, его надо включить нажатием клавиши Esc. После этого командная строка будет редактироваться командами того редактора, имя которого задано в соответствующей переменной среды окружения. По умолчанию это редактор vi. В csh и tcsh редактирование командной строки выполняется так же, как в bash.
Задания
Совокупность процессов, одновременно запущенных из среды командного процессора, называется заданием. Задание можно приостановить, продолжить или завершить. Оно может выполняться как в фоновом режиме, так и в интерактивном. Для управления заданиями большинство командных процессоров имеют встроенные команды: jobs, fg, bg.
Посмотреть список запущенных ранее заданий можно с помощью команды jobs. Для вывода идентификаторов (PID) процессов, входящих в задание, нужно использовать команду
jobs –l
То, что указано в квадратных скобках, и есть номер задания. Задания имеют уникальные номера в пределах текущего сеанса работы с shell'ом. Задание можно перевести в интерактивный режим командой fg (foreground):
fg %1
%1 – номер задания
Теперь задание выполняется в интерактивном режиме. Можно остановить его, переведя в режим suspend (sleeping, спящий): <Сtrl-z>.
Теперь можно продолжить выполнение задания в фоне командой bg (background):
bg %1
Установка приглашения
По умолчанию в sh приглашением является $, в csh – %. Root имеет приглашение #.
В среде окружения каждого командного процессора есть переменные PS1 и PS2. Это вид обычного приглашения и приглашения к продолжению ввода команды соответственно.
При вводе длинной команды можно набрать ее в две строки, для этого требуется в конце первой строки набрать символ обратного слэша, нажать Enter и продолжить ввод на следующей строке. Как правило, допустимая длина команды составляет 1024 символа. Обратный слэш экранирует следующий за ним символ перевода строки от интерпретации в качестве символа завершения команды. При переходе к новой строке появится символ > - это значение по умолчанию имеет PS2.
В csh и tcsh вместо PS1 и PS2 определены переменные prompt и prompt2. Некоторые командные процессоры, в частности, ksh, имеют дополнительные приглашения для определенных случаев. Они хранятся в переменных PS3, PS4 и т.д., а в csh – в prompt3 и prompt4.
Многие командные процессоры (прежде всего bash) умеют выводить приглашения, включающие в себя динамически подставляемые компоненты. Например, имя текущего каталога в bash подставляется в приглашение командной строки с помощью макроса \w, а в csh – %/. Макрос нужно указывать внутри апострофов, чтобы экранировать его от интерпретации командным процессором; например, в bash это выглядит так:
$PS1='\w$'
Список макроопределений для приглашений командной строки обычно содержится в руководстве.
Для ввода спецсимволов без учета их специального смысла перед ними ставится символ экранирования \ либо они заключаются в кавычки или апострофы. Кавычки отличаются от апострофов тем, что экранируют от интерпретации все спецсимволы, за исключением `, $ и \, а апострофы экранируют абсолютно все символы.
Командные процессоры csh и tcsh кэшируют сразу после запуска список исполняемых файлов из каталогов, указанных в переменной path, поэтому при изменении значения этой переменной или при добавлении новых файлов в указанные в ней каталоги следует выполнять команду rehash, чтобы командный процессор обнаружил новые каталоги и команды. Без этой команды новые программы будут недоступны.