ИМЯ
sh - Вызывает командный интерпретатор shell.
СИНТАКСИС
sh [-ceiknrstuvx] [args]
ОПИСАНИЕ
Shell - это cтандартный командный язык программирования, который выполняет чтение команд с терминала или из файла. Ниже
смотрите описание раздела ВЫЗОВ (INVOCATION), в котором описаны значения аргументов интерпретатора shell.
КОМАНДЫ
Простая команда(simple-command) - это последовательность
слов(words), не содержащих пустых символов и разделенных пробелами (пустой символ(blank) - это знак табуляции или пробел).
Первое слово определяет имя выполняемой команды. За исключением того что определено ниже, оставшиеся слова передаются как
аргументы в вызванную команду. Имя команды передается как аргумент 0 (смотрите команду exec(2)). В случае нормального завершения работы простой команды значение (value) - это состояние ее выхода, а в случае аварийного завершения (восьмеричное
значение)1000+ значение состояния (status) (т.е. если аварийно
завершилась основная процедура файла). Смотрите команду
signal(S), где приведен список оценок состояний.
Конвейер(pipeline) - это последовательность одной или более команд, разделенных символом вертикальная черта (|). (Символ ^ устаревший синоним для символа вертикальная черта и его не следует использовать в конвейере).Стандартный вывод каждой команды, кроме последней, связан каналом pipe(S) cо стандартным вводом следующей команды. Каждая команда выполняется как отдельный процесс; интерпретатор shell ждет завершения последней команды.
Список(list) - это последовательность одного или более конвейеров, разделенных символами ;,&,&& или ||(две вертикальные черты) и необязательно завершающихся символами ; или &. Из этих четырех символов, символы ; и & имеют одинаковый приоритет, который ниже чем у символов && и ||. Символы && и || также имеют равный приоритет. Точка с запятой (;) вызывает последовательное выполнение предыдущего конвейера; амперсанд (&) вызывает асинхронное выполнение предыдущего конвейера (т.е. интерпретатор shell не ждет завершения этого конвейера). Символ &&(||) вызывает список(list) следующий за ним для выполнения, только если состояние выхода предыдущего конвейера равно нулю (не ноль). Произвольное количество символов новых строк может появиться в списке (list) вместо точки с запятой (;) для разделения команд.
Команда (а cоmmand) представляет собой либо простую команду, либо одну из перечисленных ниже. Значение,возвращаемое командой,определяется значением последней простой команды выполненной в команде, кроме значений установленных иначе.
for name [in word...] do list done
Каждый раз при выполнении команды for аргумент name устанавливается для следующего слова(word), взятого из списка in word. Если аргумент in word... отсутствует, то команда for выполнит аргумент do list один раз для каждого установленного позиционного параметра (смотрите ниже описание раздела ПОДСТАНОВКА ПАРАМЕТРА (Parameter Substitution)). Выполнение завершается, когда в списке больше нет слов(words).
case word in [ pattern [|pattern ]...)list ;;] case
Команда case выполняет список list, связанный с первым шаблоном(pattern), который соответствует аргументу word. Форма шаблонов совпадает с формой, используемой при генерации имени файла (смотрите описание раздела ГЕНЕРАЦИЯ ИМЕНИ ФАЙЛА (Filename Generation)).
if list then list [ elif list then list ] [ else list ] fi
Аргумент list,следующий за командой if выполняется и, если возвращаемое состояние выхода равно 0, то выполняется список list следующий за первым параметром then. Иначе, выполнится список list, следующий за elif и, если его значение равно 0, то выполнится список list, относящийся к следующему then. В противном случае, выполнится else list. Если не выполняются аргументы else list или then list, то команда if возвращает нулевое состояние выхода.
while list do list done
Команда while неоднократно выполняет параметр while list и, если состояние выхода последней команды в списке равно нулю, то выполняет do list; в противном случае, цикл завершается. Если команды в аргументе do list не выполняются, то команда while возвращает нулевое состояние выхода; команда until может быть использована вместо команды while для отмены проверки завершения цикла.
if then else elif fi case esac for while until do done { }
КОММЕНТАРИИ
Слово, начинающееся с символа # означает, что слово и все последующие символы до символа новая строка будут игнорироваться.
ПОДСТАНОВКА КОМАНДЫ
Стандартный вывод из команды,заключенной в пару штрихов (` `),
может быть использован как для части,так и для всего слова;
последующие символы новых строк удаляются.
ПОДСТАНОВКА ПАРАМЕТРА
Символ $ используется для ввода подставляемых параметров(parameters). Позиционные параметры могут быть установлены
значениями команды set. Значения переменным могут быть назначены следующей записью:
name=value[ name=value]... (имя-значение)Сравнение шаблона с численным значением value не производится.
echo ${d:-`pwd`}
Если двоеточие (:) опушено в вышеприведенном примере, то shell только проверит установлен параметр (parameter) или нет.
Следующие параметры автоматически устанавливаются интерпретатором shell:
# | количество позиционных параметров в десятичном виде; |
---|---|
- | состояние флагов,установленных при вызове shell или командой set; |
? | десятичное значение кода возврата последней синхронно выполненной команды; |
$ | номер процесса текущего shell; |
! | номер процесса вызвавшего последнюю фоновую команду. |
Интерпретатор shell получает по умолчанию следующие значения PATH, PS1, PS2 и IFS, в то время как совсем не устанавливаются интерпретатор shell параметры HOME и MAIL (хотя HOME устанавливается командой login(5)).
ИНТЕРПРЕТАЦИЯ ПУСТОГО СИМВОЛА
После подстановки параметра и команды, результаты подстановки
просматриваются для определения символов внутренних разделителей полей (символы определены в параметре IFS) и разделяются
на отдельные аргументы, если таковые символы найдены. Явные
нулевые аргументы (" " или ' ') сохраняются. Неявные нулевые
аргументы ( возникающие из параметров, которые не имеют значений) удаляются.
ГЕНЕРАЦИЯ ИМЕНИ ФАЙЛА
Вслед за подстановкой, каждая команда word просматривается для
обнаружения символов *,?, и [. Если один из этих символов присутствует, то команда word рассматривается как шаблон
(pattern). Команда word замещается именами файлов, отсортированными в алфавитном порядке, которые соответствуют шаблону.
Если нет имени файла соответствующего шаблону, то команда word
остается неизменной. Символ . в начале имени файла или непосредственно следующий за символом /, так же как сам символ /,
должен быть точно указан. Символы и соответствующие им
шаблоны:
* | Соответствует любой строке, включая нулевую строку. |
---|---|
? | Соответствует любому одиночному символу |
[...] | Соответствует любым символам из заданного набора. Пара символов разделенных - (тире) соответствует любому лексическому символу, содержащемуся между парой символов. Если первый символ, следующий за открывающейся квадратной скобкой "[" это символ "!", то это соответствует любому символу не включенному в скобки. |
ЗАКЛЮЧЕНИЕ В КАВЫЧКИ (Quoting)
Cледующие символы имеют специальное назначение в интерпретаторе shell и вызывают завершение команды word (кроме случаев,
когда эти символы заключены в кавычки):
; & ( ) | ^ < > символ новой строки, пробел, символ табуляции
Символ может быть заключен в кавычки (т.е.подготовлен для установки самого себя) предшествующим ему символом \. Комбинация пары символов \ и знак новой строки игнорируются. Все символы, заключенные между парой одинарных кавычек (' '), за исключением одинарной кавычки(апостроф), берутся в кавычки. Внутри двойных кавычек (" ") осуществляется подстановка параметра и команды и символ \ заключает в кавычки символы \,`," и $. Символ "$ *" эквивалентен "$1 $2...", тогда как символ "$@" эквивалентен "$1" "$2"....
ПОДСКАЗКА
Когда вы работаете в интерактивном режиме, то перед чтением
команды интерпретатор shell выводит подсказку, значение параметра PS1. Если в любой момент времени набрана новая строка и
требуется продолжение ввода текста для завершения набора команды, то появляется вторичная подсказка(т.е.значение параметра PS2).
ПРОГРАММА ПРОВЕРКИ ОРФОГРАФИИ
Когда используется команда cd(1) интерпретатор shell проверяет
орфографию введенной команды. Для примера, если вы переходите
в другой каталог, используя команду cd и сделали орфографическую ошибку в имени каталога, интерпретатор shell сообщает альтернативную орфографию существующего каталога. Введите "y" и
нажмите RETURN (или просто нажмите RETURN) для перехода в
предложенный каталог. Если предложенная орфография некорректна, введите "n", затем введите корректную командную строку. В
следующем примере, реакция интерпретатора shell на ввод команды sh(1) показана жирным шрифтом:
$cd/usr/spol/uucp cd/usr/spool/uucp?y ok
ВВОД/ВЫВОД
Перед выполнением команды, ее ввод и вывод может быть переадресован с помощью специальной системы обозначений интерпретируемой shell. Обозначения могут появится где-либо в простой
команде, а также могут предшествовать или следовать за командой (сommand). Они не переходят в вызванную команду; подстановка располагается перед словом word или цифрой digit:
Если любой, из выше перечисленных, конструкций предшествует цифра, то файл будет иметь дескриптор, задаваемый этой цифрой (вместо используемых по умолчанию дескрипторов 0 и 1). Например,
...2>&1команда создает дескриптор файла 2, который является дублем дескриптора файла 1.
Если за командой следует символ &, то стандартный ввод по умолчанию для команды это пустой файл /dev/null. Иначе,среда для выполнения команды содержит дескрипторы файлов вызываемого shell, измененные спецификациями ввода/вывода.
СРЕДА
Среда (environment)(смотрите описание команды environ(5)) это
список пар "имя-значение", который передается в выполняемую
программу точно также как и обычный список аргументов. Интерпретатор shell взаимодействует со средой несколькими способами.
При вызове, shell просматривает среду и создает параметр для
каждого найденного имени, назначая ему соответствующее значение. Выполненные команды наследуют ту же самую среду. Если
пользователь изменяет значения этих параметров или создает новые, то никакие из этих параметров не влияют на среду, кроме
команды export, которая используется для связи параметров
shell со средой. Среда просмотренная любой выполненной командой состоит из любых неизмененных пар "имя-значение" первоначально унаследованных интерпретатором shell, минус любые пары
удаленные с помощью команды unset, плюс любые изменения или
дополнения, каждые из которых должны быть записаны в командах
export.
Среда для любой простой команды (simple-command) может быть увеличена c помощью использования перед ней одного или более назначений параметров. Таким образом:
TERM=450cmd args и (export TERM; TERM=450; cmd args)эквивалентны (что касается выполнения выше приведенной команды сmd).
Если флаг -k установлен, то все ключевые аргументы размещаются в среде, даже если они указаны после имени команды.
CИГНАЛЫ
Сигналы INTERRUPT(прерывание) и QUIT(выход) для вызванной команды игнорируются, если за командой следует символ &; иначе,
сигналы имеют значения унаследованные интерпретатором shell от
его родительского процесса, с ожиданием сигнала 11. Ниже смотрите описание команды trap).
ВЫПОЛНЕНИЕ
Каждый раз когда выполняется команда осуществляются вышеприведенные подстановки. Если имя команды не соответствует одной из
ВСТРОЕННЫХ КОМАНД, но соответствует имени определенной функции, то функция выполняется в процессе shell (заметим как это
отличается от выполнения процедур shell). Позиционные параметры $1,$2... устанавливаются для аргументов функции. Если имя
команды не соответствует ни встроенной команде, ни имени определенной функции, то создается новый процесс и осуществляется
попытка выполнить команду с помощью команды exec(2).
Параметр shell PATH определяет путь поиска каталога, содержащего команду. Имена альтернативных каталогов разделяются двоеточием(:). Путь по умолчанию это :/bin:/usr/bin (определяя текущий каталог в таком порядке /bin и /usr/bin). Заметим, что текущий каталог определяется именем нулевого пути, которое может появиться сразу после знака равенства или между символами двоеточие(:) в любом месте в списке пути. Если имя команды содержит символ /, то путь поиска не используется. Иначе, каждый каталог указанный в пути поиска просматривается для поиска выполняемого файла. Если файл выполняемый, но не является файлом a.out, то он будет представлять собой файл, содержащий команды shell. Субинтерпретатор sub-shell (т.е.отдельный процесс) создается для его чтения. Заключенная в скобки команда также выполняется в субинтерпретаторе sub-shell.
Местоположение в пути поиска, где была найдена команда, запоминается shell (чтобы избежать лишних действий позднее). Если команда была найдена в связном каталоге, ее местоположение должно быть переопределено всякий раз, когда изменяется текущий каталог. Интерпретатор shell забывает все сохраненные местоположения, всякий раз, когда переменная PATH изменяется или выполняется команда hash-r (описание ее смотрите ниже).
ВСТРОЕННЫЕ КОМАНДЫ
Для этих команд разрешена переадресация ввода/вывода.
Если shell прочитал его команды с терминала и указанного каталога не существует (или не найдены некоторые компоненты), используется исправление орфографии каждой компоненты каталога (directory) для поиска "корректного" имени, затем shell запрашивает надо ли изменять каталог на исправленное имя каталога, ответ "n" подразумевает "нет", любой другой ответ означает "да".
\b | возврат на одну позицию |
---|---|
\c | печатает строку без символа новой строки |
\f | прогон страницы |
\n | символ новой строки |
\r | возврат каретки |
\t | табуляция |
\v | вертикальная табуляция |
\\ | символ backslash |
\n | 8-битовый символ, чей код ASCII представляет собой 1,2,3-х разрядное число в восьмеричной форме, число n должно начинаться с нуля |
-е | Если интерпретатор shell неинтерактивный,то осуществляется немедленный выход, в случае если команда завершилась с ненулевым кодом завершения работы. |
---|---|
-f | Запрет формирования имени файла. |
-h | Разместить и запомнить функциональные команды как функции,которые определены (функциональные команды обычно размещаются, когда функция выполнена). |
-k | Поместить в среду все ключевые параметры для команды, а не только те, которые предшествуют имени команды. |
-n | Считать команды, но не выполнять их. |
-u | Считать ошибкой подстановку неустановленных переменных. |
-v | Печатать входные строки shell по мере их считывания. |
-x | Печатать команды и их параметры по мере их выполнения. Хотя этот флаг передается в субинтепретатор (sub-shell), он не может быть отслежен в этих субинтерпретаторах. |
-- | Не изменять любые флаги; полезен в установке $1 в -. |
Для отмены назначений флагов лучше использовать символ + вместо символа -. Эти флаги также могут задаваться при вызове интерпретатора shell. Текущую установку флагов можно найти в параметре $-. Оставшиеся аргументы это позиционные параметры и присваиваются по порядку переменным $1,$2,... Если не задано ни одного параметра, то будут распечатаны значения всех переменных.
-f | налагает ограничение размера блоков n в файлах, созданных процессами-потомками (могут быть прочитаны файлы любого размера). Любой пользователь может уменьшить ограничение размера файла, но увеличить ограничение может только привилегированный пользователь, находящийся в корневом каталоге. Если команда без аргументов, то будет напечатано текущее ограничение. Если опции не заданы, то назначается опция -f. |
---|
ВЫЗОВ
Если shell вызван через команду exec(2) и первый символ нулевого параметра это -, то команды первоначально читаются из
входного файла /etc/profile, а затем из файла $HOME/.profile,
если такие файлы существует. После этого, команды считываются
как описано ниже, что происходит также в случае, когда shell
вызван как /bin/sh. Приведенные ниже флаги интерпретируются
shell только при вызове. Отметим, что кроме того что указывается флаг -с или -s, первому аргументу назначается имя файла
содержащего команды, и оставшиеся аргументы передаются как позиционные параметры в этот командный файл:
-с string | Если задан флаг -с, то команда считывается из строки string. |
---|---|
-s | Если задан флаг -s или если аргументы не сохраняются, то команды считываются из стандартного ввода. Любые оставшиеся аргументы определяют позиционные параметры. Вывод интерпретатора shell записывается в файл с дескриптором 2. |
-t | Если задан флаг -t, то читается и выполняется одиночная команда и интерпретатор shell завершается. Этот флаг предназначается для использования только программами написанными на языке С и бесполезен в интерактивном режиме. |
-i | если задан флаг -i или если ввод и вывод shell связаны с терминалом, то этот shell является интерактивным. В этом случае, сигнал завершения TERMINATE игнорируется ( так что команда kill 0 не вызовет прекращение работы интерактивного shell) и сигнал прерывания INTERRUPT перехватывается и игнорируется( так что команда wait прерываема). Во всех случаях, сигнал выхода QUIT игнорируется shell. |
-r | если задан флаг -r, то работает ограниченный shell. (смотрите описание команды rsh(1)). |
Оставшиеся флаги и аргументы приведены в описании команды set приведенной выше.
СОСТОЯНИЕ ВЫХОДА
При обнаружении ошибок интерпретатором shell, таких как синтаксические ошибки, он возвращает ненулевое состояние выхода.
Если shell используется в неинтерактивном режиме, выполнение
файла shell прекращается. Иначе, shell возвращает состояние
выхода последней выполненной команды. Смотрите описание команды exit приведенное выше.
ФАЙЛЫ
/etc/profile системный файл по умолчанию profile,если ника- кие другие не присутствуют $HOME/.profile читается логическим интерпретатором shell при подключении /tmp/sh* временный файл для символов >> /dev/null источник пустого файла
СМ. ТАКЖЕ
cd(1), env(1), login(5), newgrp (1), rsh(1), test(1),
umask(1), dup(2), exec(2), fork(2), pipe(2), signal(S),
umask(2), wait(2), a.out(3), profile(5), environ(5).
ЗАМЕЧАНИЯ
Команда readonly (без параметров) осуществляет такой же вывод
как и команда export.
Если используются символы << для обеспечения стандартного ввода в асинхронном процессе, вызванном с помощью символа &, то shell имеет путаную информацию о имени вводного документа; создается файл содержащий "мусор" /tmp/sh* и shell сообщает о невозможности найти этот файл с помощью другого имени.
Если команда выполнена и команда с тем же самым именем установлена в каталоге, входящего в путь поиска, до каталога, где была найдена исходная команда, shell будет продолжать выполнять (exec) исходную команду. Для изменения этой ситуации используйте команду hash.
Если вы покинули текущий каталог или каталог, расположенный выше текущего, то команда pwd не сможет выдать корректный ответ. Используйте команду cd с полным именем пути для изменения этой ситуации.
Когда пользователь команды sh(1) входит в систему, то она читает и выполняет команды из файла /etc/profile до выполнения команд из файла пользователя $HOME/.profile. Поэтому, вы можете изменить среду для всех пользователей команды sh(1) в системе, отредактировав файл /etc/profile.