Когда вы вводите команду в оболочке Bourne, оболочка сначала выполняет предварительную обработку команды, делая все подстановки. Затем она выполняет команду, если соблюдены следующие условия:
ИЛИ
Если команда не совпадает ни со встроенной командой, ни с именем определенной функции, но указывает на выполняемый файл, являющийся откомпилированной программой (кодом), то оболочка становится родительской и порождает новый (дочерний) процесс, немедленно запускающий программу. Если файл помечен как выполняемый, но не является откомпилированной программой, то оболочка предполагает, что это процедура оболочки. В этом случае оболочка порождает новый экземпляр самой себя (подоболочку) с целью прочесть файл и выполнить указанные в нем команды. Кроме того, оболочка запускает заключенную в круглые скобки команду в подоболочке. С точки зрения конечного пользователя, откомпилированная программа выполняется точно так же, как процедура оболочки. Обычно оболочка просматривает каталоги файловой системы в поисках команд в следующем порядке:
Оболочка просматривает каталоги по очереди. Если в просматриваемом каталоге команда не найдена, оболочка переходит к следующему каталогу.
Примечание: Порядок просмотра каталогов определяется переменной PATH. Вы можете изменить его, задав другое значение переменной PATH.
Если вы укажете конкретный путь при запуске команды (например, /usr/bin/sort), то оболочка будет выполнять поиск только в указанном каталоге. Если имя команды содержит косую черту (/), то путь поиска не применяется.
Вы можете указать полный путь от корневого каталога (например, /usr/bin/sort). Вы можете также указать неполный путь (путь относительно текущего каталога). Например, если вы укажете:
bin/myfile
то оболочка будет искать каталог bin и его файл myfile в текущем каталоге.
Примечание: В оболочке с ограничениями команды, содержащие символ / (косая черта), не выполняются.
Для каждой выполненной команды оболочка запоминает ее расположение в пути поиска (во избежание выполнения впоследствии ненужных команд exec). Если команда находится в некорневом каталоге, то ее расположение должно определяться заново при каждом изменении текущего каталога. Оболочка "забывает" все известные ей расположения в случае изменения переменной PATH или запуска команды hash -r.
В этом разделе приведена информация по следующим темам:
Некоторые символы для оболочки являются специальными. Иногда возникает необходимость указать такие специальные символы как обычные. Для этого следует заключить строку символов в одинарные (') или двойные кавычки (") или поставить обратную косую черту (\) перед одним символом.
В случае применения одинарных кавычек все символы, за исключением начальной и конечной одинарных кавычек, воспринимаются как обычные, без учета их специального значения. Таким образом, команда:
stuff='echo $? $*; ls * | wc'
присвоит строку символов echo $? $*; ls * | wc переменной stuff. Оболочка не будет выполнять команды echo, ls и wc, а также раскрывать переменные $? и $* и специальный символ * (звездочка).
Будучи заключенными в двойные кавычки, символы $ (знак доллара), ` (обратная кавычка) и " (двойная кавычка) сохраняют свое специальное значение, в то время как все остальные символы воспринимаются как обычные. Таким образом, в строке, заключенной в двойные кавычки, выполняется подстановка команд и переменных. Кроме того, кавычки не влияют на команды, полученные в результате подстановки в строке, заключенной в кавычки, поэтому специальные символы в таких командах сохраняют свое значение.
Рассмотрим следующую последовательность строк:
ls *
файл1 файл2 файл3
message="Этот каталог содержит `ls * ` "
echo $message
Этот каталог содержит файл1 файл2 файл3
Приведенный пример показывает, что специальный символ * (звездочка) был раскрыт при подстановке команды.
Если необходимо отменить специальное значение символов $ (знак доллара), ` (обратная кавычка) и " (двойная кавычка) в строке, заключенной в двойные кавычки, поставьте перед символом знак \ (обратная косая черта). Если двойные кавычки не применяются, то постановка обратной косой черты перед символом эквивалентна заключению символа в одинарные кавычки. Следовательно, обратная косая черта, стоящая перед символом перехода на новую строку (т.е. обратная косая черта в конце строки), скрывает символ перехода на новую строку и позволяет продолжить команду на следующей физической строке.
Оболочка игнорирует сигналы INTERRUPT и QUIT для выполняемой команды, если команда оканчивается символом & (амперсанд), т.е. если команда выполняется в фоновом режиме. В остальных случаях значения сигналов наследуются от родительской оболочки, за исключением сигнала SEGMENTATION VIOLATION (нарушение сегментации). Дополнительная информация приведена в справке по встроенной команде оболочки Bourne trap.
Составными называются следующие команды:
Если не указано противное, вывод составной команды - это значение, выданное последней простой командой.
Следующие зарезервированные слова распознаются только при условии, что они указаны без кавычек в качестве первого слова команды:
for do done case esac if then fi elif else while until { } ( )
forИдентификатор [inСлово . . .]do Списокdone | Присваивает параметру Идентификатор одно или несколько слов, заданных параметром Слово (по одному слову поочередно), и запускает команды, перечисленные в параметре Список. Если вы опустите inСлово . . ., то команда for запустит команды, перечисленные в параметре Список, для каждого заданного позиционного параметра; обработка будет завершена, когда все позиционные параметры будут использованы. |
caseСлово in Шаблон [|Шаблон] . . . )Список;; [Шаблон [|Шаблон] . . . )Список;;]. . . esac | Запускает команды, перечисленные в параметре Список и связанные с первым из параметров Шаблон, соответствующим значению параметра Слово. В шаблонах применяется тот же формат и обозначения, что и в подстановке имен файлов, за исключением того, что символы / (косая черта), начальная точка или точка, стоящая сразу за косой чертой, могут служить символами подстановки. |
if Список then Список [elif Список then Список] . . . [else Список] fi | Запускает команды, перечисленные в параметре Список после команды if. Если команда возвращает нуль, то оболочка запускает команды, перечисленные в параметре Список после команды then. Иначе оболочка запускает команды, перечисленные в параметре Список после команды elif (если последняя указана). Если результирующим значением будет ноль, то оболочка запустит команды, перечисленные в параметре Список после следующей команды then. В противном случае оболочка запустит команды, перечисленные в параметре Список после команды else (если последняя указана). Если команды else - Список и then - Список отсутствуют, то команда if возвращает нулевое значение. |
while Список do Список done | Запускает команды, перечисленные в параметре Список после команды while. Если последняя команда в параметре Список команды while возвращает нуль, оболочка выполняет команды, перечисленные в параметре Список команды do. Выполнение цикла по всем спискам продолжается до тех пор, пока последняя команда из параметра Список команды while не возвратит ненулевое значение. Если команды в параметре Список команды do отсутствуют, то команда while возвращает нулевое значение. |
until Списокdo Список done | Запускает команды, перечисленные в параметре Список после команды until. Если последняя команда в параметре Список команды until возвращает ненулевое значение, оболочка выполняет команды, перечисленные в параметре Список команды do. Выполнение цикла по всем спискам продолжается до тех пор, пока последняя команда из параметра Список команды until не возвратит нуль. Если команды в параметре Список команды do отсутствуют, то команда until возвращает нулевое значение. |
(Список) | Запускает команды, перечисленные в параметре Список, в подоболочке. |
{Список; } | Запускает команды, перечисленные в параметре Список, в текущей оболочке, не запуская подоболочку. |
Имя () {Список} | Определяет функцию, указанную в параметре Имя. Тело функции образует список команд в фигурных скобках в параметре Список. |
Особые команды встроены в оболочку Bourne и выполняются как ее процессы. Если не указано противное, вывод команд записывается в файл с дескриптором 1 (stdout) с результирующим кодом 0 (ноль), если команда не содержит синтаксических ошибок. Разрешается перенаправление ввода и вывода.
Полный перечень встроенных команд в алфавитном порядке приведен в разделе Список встроенных команд оболочки Bourne.
Следующие особые команды обрабатываются несколько иначе, чем остальные встроенные команды:
: (двоеточие) exec shift . (точка) exit times break export trap continue readonly wait eval return
Оболочка Bourne обрабатывает эти команды следующим образом:
В оболочке Bourne предусмотрены следующие особые встроенные команды:
Встроенные команды | |
---|---|
: | Возвращает нуль. |
. Файл | Считывает и выполняет команды из файла, указанного в параметре Файл, после чего возвращает к исходному уровню. Подоболочка не запускается. Каталог указанного файла определяется по пути поиска, заданного переменной PATH. |
break [ n ] | Прерывает внешний цикл команды for, while или until, если он выполняется. Если вы укажете переменную n, то команда break прервет n уровней циклов. |
continue [ n ] | Возобновляет следующий внешний цикл команды for, while или until. Если вы укажете переменную n, то команда возобновит цикл n-го уровня. |
cdКаталог] | Переходит к каталогу Каталог. Если Каталог
не указан, будет использовано значение переменной оболочки
HOME. Путь к каталогу Каталог определяется
переменной оболочки CDPATH. Переменная CDPATH -
это список альтернативных имен каталогов, перечисленных через
двоеточие. Пустой путь (путь по умолчанию) соответствует текущему
каталогу. Этот пустой путь указан сразу после знака равенства в
операторе присвоения или между двоеточиями-разделителями в списке
путей. Если Каталог начинается с символа / (косая черта), то
путь поиска не применяется. В противном случае, поиск выполняется в
каждом каталоге, указанном в переменной CDPATH.
Примечание: В оболочке с ограничениями команду оболочки cd запускать нельзя. |
echoСтрока . . . ] | Записывает строки символов в устройство стандартного вывода. Информация о применении и параметрах приведена в справке по команде echo. Флаг -n не поддерживается. |
eval [ Аргумент . . . ] | Считывает аргументы в качестве входных данных оболочки и запускает сформированные команды. |
exec [ Аргумент . . . ] | Запускает команду, указанную в параметре Аргумент, вместо данной оболочки, не создавая новый процесс. Допустимы аргументы ввода и вывода; если других аргументов нет, то с их помощью можно изменять входные или выходные данные оболочки. Эту команду не рекомендуется выполнять в начальной оболочке. |
exit [ n ] | Завершает работу оболочки с результирующим значением, указанным в параметре n. Если этот параметр не указан, то значением выхода будет результат выполнения последней команды (работу оболочки можно также завершить нажатием клавиш Ctrl-D). В качестве n допустимы значения от 0 до 255 включительно. |
export [ Имя . . . ] | Помечает указанные имена для автоматического экспортирования в среды выполняемых впоследствии команд. Если параметр Имя опущен, то команда export выдает список всех имен, экспортированных в данной оболочке. Имена функций экспортировать нельзя. |
hash [ -r ][ Команда . . . ] | Находит и запоминает расположение в пути поиска всех команд, указанных в
параметре Команда. Флаг -r удаляет всю хранящуюся
в оболочке информацию о расположениях. Если ни флаг, ни команды не
указаны, то оболочка выдаст информацию о командах, расположения которых
известны, в следующем формате:
Запуски Стоимость Команда |
| В колонке Запуски указано, сколько раз оболочка запускала команду. В колонке Стоимость указан объем работы, который потребовался на поиск команды в пути поиска. В колонке Команда указан путь к команде. В некоторых случаях необходимо повторно определить путь к команде, например, если путь относительный, т.е. указан от текущего каталога, а текущий каталог изменился. Команды, для которых может потребоваться такая операция, помечены символом * (звездочка) рядом с колонкой Запуски. Значение в колонке Стоимость увеличивается при каждом вычислении пути. |
pwd | Показывает текущий каталог. Описание опций приведено в справке по команде pwd. |
read [ Имя . . . ] | Считывает одну строку из стандартного ввода. Первое слово в этой строке присваивается первому параметру Имя, второе - второму параметру Имя и т.д.; последнему параметру Имя присваиваются все оставшиеся слова. Если команда не обнаруживает символ конца файла, то она возвращает нуль. |
readonly [ Имя . . . ] | Помечает имя, указанное в параметре Имя, как доступное только для чтения. Сбросить значение имени нельзя. Если Имя не указано, то команда readonly выдает список всех имен, доступных только для чтения. |
return [ n ] | Завершает работу функции со значением возврата n. Если переменная n опущена, то функция возвратит состояние последней команды, которую она выполнила. Эта команда применима только к функциям оболочки. |
set [ Флаг [ Аргумент ] . . . ] | Задает один или несколько следующих флагов:
|
Указание плюса (+) вместо дефиса (-) сбрасывает флаги. Эти флаги можно также задать в командной строке оболочки. Специальная переменная $- содержит текущий набор флагов. Любой Аргумент, указанный в команде set, становится
позиционным параметром и присваивается $1, $2 и
т.д. по порядку. Если флаг и
Аргумент опущены, команда set выдает все имена и
значения текущих переменных оболочки.
| |
shift [n] | Сдвигает аргументы командной строки влево, т.е.
переприсваивает значения позиционных параметров, аннулируя текущее значение
$1 и присваивая значение $2 параметру $1,
значение $3 - параметру $2 и т.д. Если в
командной строке указано больше 9 аргументов, то 10-й присваивается параметру
$9, а остальные остаются неприсвоенными (до следующей команды
shift). Если аргументов 9 или меньше, то команда
shift сбрасывает позиционный параметр с наибольшим номером,
которому присвоено значение.
Позиционный параметр $0 никогда не сдвигается. Команда shift n - это сокращенная форма записи n команд последовательного сдвига. Значение параметра n по умолчанию равно 1. |
testВыражение | [ Выражение ] | Вычисляет условные выражения. Описание флагов и параметров приведено в справке по команде test. Флаг -h не поддерживается встроенной командой тестирования в bsh. |
times | Показывает общее время, которое заняло выполнение пользовательских и системных процессов в оболочке. |
trap [ Команда ] [ n] . . . | Запускает команду, указанную в параметре Команда, когда
оболочка принимает один или несколько сигналов, заданных параметром
n. Порядок запуска команд trap определяется
номерами сигналов. Любая попытка задать прерывание (trap) по сигналу,
проигнорированному при входе в текущую оболочку, будет неудачной.
Примечание:Оболочка просматривает параметр Команда первый раз, когда прерывание устанавливается, а второй раз - когда оно происходит.
Если команда опущена, то все прерывания, указанные в параметре n, сбрасываются к их текущим значениям. Если указана пустая строка, то сигнал игнорируется оболочкой и выполняемыми ей командами. Если параметр n равен нулю, то указанная команда выполняется при выходе из оболочки. Если ни команда, ни сигнал не заданы, то команда trap выдает список команд, связанных с номерами сигналов. |
type [Имя . . . ] | Для каждого имени, заданного в поле Имя, указывает способ обработки его оболочкой как имени команды. |
ulimit [-HS] [ -c | -d | -f | -m | -s | -t] [limit] | Показывает или настраивает выделенные ресурсы оболочки.
Предусмотрено два режима просмотра параметров ресурсов оболочки: по
отдельности для каждого ресурса или для группы ресурсов. Режим по
умолчанию - просмотр ресурсов, которым присвоено "мягкое" значение (нижняя
граница), в группе.
Значения ресурсов оболочки зависят от ИД пользователя текущей оболочки. "Жесткий" уровень ресурса может задать только пользователь текущей оболочки с правами доступа root. Если у вас нет прав доступа root, то попытка установить "жесткий" уровень ресурса приведет к ошибке. По умолчанию пользователь root задает и "жесткий", и "мягкий" уровни конкретного ресурса. По этой причине, пользователь root должен быть осторожен при указании флагов -S, -H или флагов по умолчанию для установки ограничений. Пользователи, не имеющие прав доступа root, могут задавать только "мягкую" границу ресурса. После того, как ограничение снижено пользователем без прав доступа root, его нельзя увеличить, даже до первоначального системного значения. Для того чтобы задать ограничение на ресурс, выберите соответствующий флаг и ограничение для нового ресурса, которое должно быть целым числом. За один раз можно задать только одно ограничение на ресурс. Если вы укажете несколько флагов ресурсов, результаты будут непредсказуемыми. По умолчанию команда ulimit с одним новым значением в командной строке задает размер файла оболочки. Флаг -f необязателен. Допустимы следующие флаги команды ulimit:
|
umask [nnn] | Определяет права доступа к файлу. Это значение, совместно с правами доступа создающего процесса, определяет права доступа к создаваемому файлу. Значение по умолчанию: 022. Если значение не указано, команда umask показывает текущее значение. |
unset [Имя . . .] | Сбрасывает переменные и функции, имена которых перечислены в параметре Имя. Сбросить переменные оболочки PATH, PS1, PS2, MAILCHECK и IFS нельзя. |
wait [n] | Ожидает завершения дочернего процесса, номер которого указан в параметре n, и возвращает состояние выхода этого процесса. Если параметр n опущен, то оболочка ожидает завершения всех текущих активных дочерних процессов и возвращает нуль. |
Подстановка команд позволяет сделать вывод одной команды аргументом другой команды. Если вы заключите команду в обратные кавычки (``), то оболочка сначала запустит все перечисленные команды, а затем заменит все выражение, включая обратные кавычки, на данные вывода. Этот прием часто применяется для присвоения значений переменным оболочки. Например, оператор:
today=`date`
присваивает строку, задающую текущую дату, переменной today. Следующая операция присвоения сохраняет в переменной files количество файлов в текущем каталоге:
files=`ls | wc -l`
Вы можете выполнить подстановку команд в любой команде, создающей стандартный вывод.
Если вы хотите указать вложенные подстановки, поставьте обратную косую черту (\) перед каждой из открывающих обратных кавычек, например:
logmsg=`echo Ваш начальный каталог: \`pwd\``
Кроме того, вы можете присваивать значения переменным оболочки косвенно с помощью особой команды read. Эта команда считывает строку из стандартного ввода (с клавиатуры) и последовательно присваивает ее слова любым указанным переменным. Например, команда:
read first init last
считывает строку:
И. П. Иванов
то результат будет тем же, как если бы вы ввели:
first=И. init=П. last=Иванов
Особая команда read присваивает все лишние слова последней переменной.