Командный интерпретатор Korn (UNIX)
ksh [+-abCefhikmnprsuvxX] [+-o option] [[ -c string_of_options [command_name] | -s | файл ] [аргумент...]]
Следующие опции можно определить только в командной строке:
В дополнение к вышеупомянутым, можно использовать опции, описанные для встроенной команды set, в командной строке.
ЗОСРВ «Нейтрино»
aarch64, arm, armv7, e2k, mips, ppc, x86
ksh представляет собой общедоступную версию командного интерпретатора Korn. Это интерпретатор команд, предназначенный для использования в интерактивном режиме и в режиме сценария командного интерпретатора.
Этот командный интерпретатор отличается от стандартного командного интерпретатора QNX 4, который был разработан по образцу ksh86. |
Это описание включает в себя следующие разделы:
Если не указана ни опция -c, ни опция -s, то первый аргумент, не являющийся опцией, определяет имя файла, из которого командный интерпретатор считывает команды; если аргументы, не являющиеся опциями, отсутствуют, то командный интерпретатор считывает команды из стандартного потока ввода. Имя командного интерпретатора (т.е. содержимое параметра $0
) определяется следующим образом: если используется опция -c и присутствует аргумент, не являющийся опцией, то последний используется в качестве имени командного интерпретатора; если команды считываются из файла, то в качестве имени используется имя этого файла; в противном случае используется имя, посредством которого был вызван командный интерпретатор (т.е. argv[0]).
Командный интерпретатор работает в интерактивном режиме, если указана опция -i или если и стандартный поток ввода, и стандартный поток ошибок подключены к терминалу ввода-вывода. У интерактивного командного интерпретатора активировано управление заданиями (при наличии), игнорирование сигналов SIGINT
, SIGQUIT
и SIGTERM
и вывод приглашений перед считыванием ввода (см. параметры PS1 и PS2). Для неинтерактивных командных интерпретаторов по умолчанию включена опция trackall (см. далее описание команды set).
Командный интерпретатор является ограниченным, если указана опция -r или если базовое имя, посредством которого вызван командный интерпретатор, либо параметр SHELL
соответствуют шаблону "*r*sh" (например, rsh, rksh и т.д.). После обработки командным интерпретатором какого-либо профиля и файлов $ENV
вступают в силу следующие ограничения:
SHELL
, ENV
и PATH
невозможно. >
, >>|
, >>
, <>
). Командный интерпретатор является привилегированным, если указана опция -p или если реальный идентификатор пользователя или группы не соответствует действующему идентификатору пользователя или групповому идентификатору (см. getuid() и getgid()). Привилегированный командный интерпретатор не обрабатывает $HOME/.profile
или переменную среды ENV
(см. далее); вместо этого он обрабатывает файл /etc/suid_profile
. В результате очистки опции привилегии командный интерпретатор устанавливает эффективный идентификатор пользователя (группы) равный реальному идентификатору пользователя (группы).
Если базовое имя, посредством которого вызывается командный интерпретатор (т.е. argv[0]), начинается с -
или используется опция -l, то предполагается, что командный интерпретатор является начальным командным интерпретатором. В этом случае командный интерпретатор считывает и выполняет содержимое /etc/profile
и $HOME/.profile
, если они существуют и доступны для чтения.
Если при запуске командного интерпретатора (или, как в случае с начальными командными интерпретаторами, после обработки каких-либо профилей) установлена переменная среды ENV
, то ее значение определяется подстановкой параметра, команды, тильды и арифметической подстановки, а считывается и выполняется результирующий файл (при наличии). Если переменная среды ENV
не установлена (и ее значение не является пустым) и компиляция ksh была выполнена определенным макросом DEFAULT_ENV
, то включается указанный в этом макросе файл (после выполнения вышеупомянутых подстановок).
Работа командного интерпретатора завершается со статусом 127, если командный файл, указанный в командной строке, не удалось открыть. Если во время выполнения сценария возникла фатальная ошибка синтаксиса, то статус завершения командного интерпретатора будет отличным от нуля. В отсутствие фатальных ошибок статусом завершения является статус завершения последней выполненной команды или нуль, если команда не была выполнена.
Командный интерпретатор начинает синтаксический анализ своего потока ввода путем его разбиения на слова. В качестве разделителей для слов, которые являются последовательностями символов, используются не экранированные в кавычки пробельные символы (символы пробела, табуляции и новой строки) или метасимволы (<
, >
, |
, ;
, &
, (
и )
). Кроме случаев разделения слов, символы пробела и табуляции игнорируются, тогда как символы новой строки обычно разделяют команды. Метасимволы используются при построении следующих лексем:
<
, <&
, <<
, >
, >&
, >>
и т.д. |
|&
;
&
&&
и ||
;;
(( .. ))
( .. )
Можно экранировать пробельные символы и метасимволы по отдельности с помощью обратной косой черты (\
) или группой с помощью двойных (") или одинарных (') кавычек. Следует отметить, что командный интерпретатор по особенному обрабатывает следующие символы, которые необходимо экранировать, если они должны представлять самих себя:
#
#
следует !
shell. Это позволяет запустить сценарий при помощи альтернативного командного интерпретатора. Например, если интерпретатор команд сsh находится в /bin/csh, то можно указать ksh запускать сценарии с помощью интерпретатора команд сsh путем ввода следующей строки в начало сценариев: $
~
{
и }
*
, ?
и [
При синтаксическом анализе слов и лексем командный интерпретатор выстраивает команды двух следующих основных типов: простые команды, которые обычно представляют собой выполняемые команды, и составные команды, например, операторы for и if, группирующие конструкции и определения функций.
Простая команда состоит из некоторой комбинации присвоений параметров (см. раздел Параметры), перенаправлений ввода/вывода (см. раздел Перенаправление ввода/вывода) и командных слов; единственным ограничением является необходимость того, чтобы присвоения параметров предшествовали командным словам. Командные слова, при наличии, определяют команду, которая должна быть выполнена, и ее аргументы. Команда может быть встроенной командой командного интерпретатора, функцией или внешней командой, т.е. отдельным исполняемым файлом, местоположение которого определяется параметром PATH
(см. раздел Выполнение команд и встроенные команды). Следует отметить, что все командные конструкции имеют следующие статусы завершения:
Статусом завершения команды, состоящей только из присвоений параметров, является статус завершения последней подстановки команды, выполненной во время присвоения параметра, или нуль, если подстановки команд отсутствовали.
Специальный параметр ? сохраняет статус завершения последней неасинхронной команды. Статус завершения, например, можно просмотреть посредством ввода следующей команды:
echo $? Для получения дополнительной информации см. раздел Параметры. |
С помощью лексемы |
можно выстраивать из команд цепочки, формирующие конвейеры, в которых стандартный поток вывода каждой команды, кроме последней, перенаправляется (см. утилиту pipe()) в стандартный поток ввода следующей команды. Статусом завершения конвейера является статус завершения его последней команды. Конвейеру можно задать префикс из зарезервированного слова !
, в результате чего статус завершения конвейера будет логически дополняться: если исходным статусом является 0, дополненным статусом будет 1, а если исходный статус отличается от 0, то дополненным статусом будет 0.
Можно создавать списки команд путем разделения конвейеров с помощью следующих лексем:
&&
, ||
&&
cmd2 выполняет cmd2 только в том случае, если статус завершения cmd1 является нулем; ||
является противоположностью – cmd2 выполняется только в том случае, если статус завершения cmd1 является отличным от нуля. Лексемы &&
и ||
имеют одинаковый приоритет, который выше приоритета лексем &
, |&
и ;
, приоритет которых также одинаков. &
/dev/null
(однако указанные в асинхронной команде перенаправления имеют приоритет). |&
;
;
cmd2 выполняет cmd1, и затем выполняет cmd2 после завершения первой команды. Следует отметить, что команда обязательно следует операторам &&
и ||
, в то время как следовать операторам &
, |&
и ;
для команды не обязательно. Статусом завершения списка является статус завершения последней выполненной команды, за исключением асинхронных списков, для которых статусом завершения является 0.
Составные команды создаются с помощью описанных далее зарезервированных слов. Эти слова распознаются только в том случае, если они не экранированы кавычкам и используются в качестве первого слова команды (т.е. возможность поместить присвоения параметров или перенаправления перед ними отсутствует):
case else function then ! do esac if time [[ done fi in until { elif for select while }
Некоторые командные интерпретаторы (за исключением этого) выполняют команды управляющей структуры в порожденном командном интерпретаторе, когда один или несколько соответствующих дескрипторов файлов перенаправлены таким образом, что любые изменения окружения в них завершаются отказом. Во избежание проблем с переносимостью, вместо этого необходимо использовать оператор exec для того, чтобы перенаправить дескрипторы файлов до управляющей структуры. |
В представленных далее описаниях составных команд списки команд (обозначенные как list), за которыми следуют зарезервированные слова, должны заканчиваться точкой с запятой, символом новой строки или (синтаксически правильным) зарезервированным словом. Например, следующие комбинации являются действительными:
{ echo foo; echo bar; } { echo foo; echo bar} { { echo foo; echo bar; } }
а следующая действительной не является:
{ echo foo; echo bar }
Доступны следующие команды:
{
и }
являются зарезервированными словами, а не метасимволами. .
и /
ограничения не действуют. Следует отметить, что любой неэкранированный кавычками символ пробела до и после шаблона удаляется; любой символ пробела в пределах шаблона необходимо экранировать. Как к словам, так и к шаблонам применимы подстановки параметров, команд, тильды и арифметические подстановки. ;)
выводится в стандартный поток ошибок, после чего выводится приглашение (PS3, обычно "#? "). После этого из стандартного потока ввода считывается номер, соответствующий одному из пронумерованных слов, выбранному слову устанавливается имя (в случае недействительного выбора – отменяется), параметру REPLY устанавливается считанное (начальные и конечные пробелы удаляются), и выполняется список. &&
и ||
соответственно. =
, !
и т.д.) неэкранированными кавычками. !=
и =
являются шаблоны (например, сравнение в [[ foobar = f*r ]] завершается успешно). <
и >
, которые возвращают значение "истина", если значение их первого строкового операнда меньше или больше значения их второго строкового операнда соответственно. &&
и ||
применяются отложенные вычисления выражений. Это означает, что в операторе:
Экранирование специальных символов используется для предотвращения особой интерпретации символов или слов командным интерпретатором:
Если за символом \ внутри экранированной символами двойных кавычек строки следует символ \, $, ` или ", то он заменяется вторым символом; если за ним следует символ новой строки, то и символ \, и символ новой строки удаляются. В противном случае \ и следующий за ним символ остаются неизменными.
Существуют два вида псевдонимов: стандартные псевдонимы команд и отслеживаемые псевдонимы команд обычно используются в качестве условного обозначения длинной или часто используемой команды. Командный интерпретатор раскрывает псевдонимы команд (т.е. подставляет вместо псевдонима его значение) при считывании первого слова команды. Раскрытый псевдоним повторно обрабатывается в целях проверки наличия дополнительных псевдонимов. Если псевдоним команды заканчивается символом пробела или табуляции, также выполняется проверка следующего слова с целью раскрытия псевдонима. Процесс раскрытия псевдонима завершается, когда найдено слово, которое не является псевдонимом, когда найдено экранированное слово или когда найдено слово-псевдоним, раскрытие которого в настоящее время выполняется.
Командный интерпретатор автоматически определяет следующие псевдонимы команд:
autoload='typeset -fu' functions='typeset -f' hash='alias -t' history='fc -l' integer='typeset -i' local='typeset' login='exec login' newgrp='exec newgrp' nohup='nohup ' r='fc -e -' stop='kill -STOP' suspend='kill -STOP $$' type='whence -v'
Отслеживаемые псевдонимы позволяют командному интерпретатору сохранить местоположение определенной команды для последующего использования. В первый раз при выполнении командным интерпретатором поиска по пути команды, которая отмечена как отслеживаемый псевдоним, сохраняется полный путь команды. Когда команда выполняется в следующий раз, командный интерпретатор проверяет актуальность сохраненного пути, и, если путь существует, повторно поиск пути не выполняет. Список отслеживаемых псевдонимов можно создать и вывести с помощью утилиты alias -t.
В результате изменения параметра PATH удаляются сохраненные пути ко всем отслеживаемым псевдонимам. |
Если установлена опция trackall (например, set -o trackall или set -h), командный интерпретатор отслеживает все команды. Для неинтерактивных командных интерпретаторов эта опция устанавливается автоматически. Интерактивные командные интерпретаторы отслеживают только следующие команды: cat, cc, chmod, cp, date, grep, ls, make, mv, pr, rm, sed, sh и who.
Первый шаг выполнения простой команды командным интерпретатором – обработка подстановок по словам в команде. Можно выделить три типа подстановок:
Подстановка | Форма подстановки |
---|---|
Подстановка параметра | $имя или ${...} (см. раздел Параметры) |
Подстановка команды | $(команда) или `команда` |
Арифметическая подстановка | $((выражение)) |
Если подстановка расположена за двойными кавычками, то результат подстановки, как правило, подлежит разделению на слова или поля, в зависимости от текущего значения параметра IFS (Internal Field Separator; внутренний разделитель полей).
Параметр IFS содержит список символов, используемых для разделения одной строки на несколько слов; символы пробела, табуляции и новой строки, входящие в набор символов IFS, называются пробельными символами IFS. Поля разделяются последовательностями из одного или нескольких пробельных символов IFS в сочетании с нулем или другими пробельными символами, отличными от IFS. В особом случае начальный и завершающий пробельные символы IFS удаляются (т.е. на его основе не создается начальное или завершающее пустое поле); при этом начальный или завершающий пробел, отличный от IFS, создает пустое поле.
Пример: если для IFS установлено значение <space>:, то последовательность символов <space>A<space>:<space><space>B::D будет содержать четыре поля: A, B, пустое поле, D. Следует отметить, что если для параметра IFS установлено значение пустой строки, то разделение на поля не выполняется; если этот параметр не установлен, то его значением по умолчанию является пробел, символ табуляции и символ новой строки.
Результаты подстановки также подлежат раскрытию фигурных скобок и шаблонов имен файлов, если явно не указано иное (см. соответствующие разделы далее).
Подстановка команды заменяется на выходные данные, созданные указанной командой, которая запускается в порожденном командном интерпретаторе. К подстановкам $(команда) при синтаксическом анализе команды применяются обычные правила экранирования; при использовании формы `команда` удаляется символ \ с последующим символом $, ` или \ (сочетание \ с любым другим символом после него не изменяется).
Особый случай подстановки команды: команда формы < файл представляет собой подстановку содержания файла файл. Например, подстановка $(< foo) действует аналогично подстановке $(cat foo), но вторая из них выполняется более эффективно, поскольку при этом не запускается процесс.
Выражения $(команда) в настоящее время анализируются путем поиска парной скобки без учета кавычек. В ближайшее время эта ошибка по возможности будет исправлена. |
Арифметические подстановки заменяются на значение указанного выражения. Например, команда echo $((2+3*4)) выводит результат 14. Описание формы выражение приведено в разделе Арифметические выражения.
Параметры представляют собой переменные командного интерпретатора; им можно присваивать значения и использовать эти значения посредством подстановки параметров. Именем любого параметра является один из специальных символов пунктуации или цифры, описанных далее, или буква, за которой следует несколько букв или цифр или ни одной (подчеркивание (_) считается буквой). Подстановки параметров имеют вид $имя или ${имя}, где имя – имя параметра. В случае подстановки не установленного предварительно параметра такой параметр заменяется на пустую строку, если не установлена опция nounset (set -o nounset или set -u); в последнем случае возникает ошибка.
Значения параметров можно присваивать следующими способами:
Для успешного распознавания присвоения параметра не следует экранировать имя параметра и символ =. |
Параметры с атрибутом экспорта (устанавливается посредством команды export или typeset -x либо присвоениями параметров с последующим вводом простых команд) помещаются в среду команд, запускаемых командным интерпретатором (см. описание environ()), как пары имя=значение. Порядок расположения параметров в среде команды не определяется. При запуске командный интерпретатор извлекает параметры и соответствующие значения из своего окружения и автоматически устанавливает для этих параметров атрибут экспорта.
В форме подстановки параметров ${имя} можно применять следующие модификаторы:
Если из вышеописанных модификаторов исключить символ :, то условия будут зависеть только от того, определено ли имя (в отличие от того, является ли оно определенным и не пустым значением). Если слово необходимо, то для него выполняется подстановка параметров, команд, тильды и арифметическая подстановка; если значение слово не требуется, его анализ не выполняется.
Можно также использовать следующие формы подстановки параметров:
Командный интерпретатор неявно устанавливает следующие специальные параметры (эти параметры невозможно установить напрямую путем присвоения):
Командный интерпретатор устанавливает и/или использует следующие параметры:
Замена тильды, которая выполняется параллельно с подстановкой параметров, применяется к словам, начинающимся с неэкранированного символа ~. Символы, следующие за тильдой до первой косой черты (/), при их наличии, считаются именем входа в систему. Если имя входа в систему пусто или равно + или -, то подставляется значение параметра HOME, PWD или OLDPWD соответственно. В противном случае выполняется поиск имени входа в систему по файлу паролей, и выражение тильды заменяется на основной каталог пользователя. Если имя входа в систему в файле паролей не найдено или в этом имени обнаружено экранирование или подстановка какого-либо параметра, то подстановка не выполняется.
В присвоениях параметров (предшествующих простой команде или включенных в аргументы alias, export, readonly и typeset), замена тильды выполняется после любого неэкранированного двоеточия (:); имена входа в систему также разделяются двоеточиями.
Основной каталог предварительно раскрытых имен входа в систему кэшируется и используется повторно. Для просмотра списка, изменения и добавления псевдонимов каталогов в этот кэш используется команда alias -d. Пример:
alias -d fac=/usr/local/facilities; cd ~fac/bin
Выражения в фигурных скобках, которые принимают следующую форму:
префикс{строка_1,...,строка_N}суффикс
раскрываются в N слов, каждое из которых является конкатенацией значений префикс, строка_i и суффикс. Например, выражение a{c,b{X,Y},d}e раскрывается в четыре слова: ace, abXe, abYe и ade. Как видно из примера, выражения в фигурных скобках могут быть вложенными, а результирующие слова не сортируются. Для раскрытия выражения в фигурных скобках должны содержать неэкранированную запятую (,), т.е. выражения {} и {foo} не раскрываются. Раскрытие фигурных скобок выполняется после подстановки параметров и до создания имени файла.
Шаблон имени файла представляет собой слово, содержащее один или несколько неэкранированных символов ? или * или последовательностей [...]. После раскрытия фигурных скобок командный интерпретатор заменяет шаблоны имен файлов на отсортированные имена всех файлов, совпадающие с шаблоном (если с шаблоном не совпадает ни один файл, то слово остается неизмененным). Элементы шаблона имеют следующие значения:
Следует отметить, что в настоящее время ksh не выполняет сравнение . и .., однако в исходном ksh, Bourne sh и bash сравнение этих символов предусмотрено, поэтому в существующее поведение могут быть внесены изменения.
Кроме того, ни одному из упомянутых элементов шаблонов не соответствует точка (.) в начале имени файла и косая черта (/), даже если они явно указаны в последовательности [...]; кроме того, ни одному шаблону не соответствуют имена . и .., даже при вводе .*. |
Если установлена опция markdirs, то любые каталоги, полученные в результате создания имен файлов, отмечаются завершающим символом /.
Классы символов POSIX (т.е. [:имя_класса:] в выражении [...]) в настоящее время не реализованы. |
При выполнении команды ее стандартные потоки ввода, вывода и ошибок (дескрипторы файлов 0, 1 и 2 соответственно) обычно наследуются от командного интерпретатора. Три исключения из этого правила: команды в конвейерах, для которых стандартные потоки ввода и стандартные потоки вывода устанавливаются конвейером; асинхронные команды, создаваемые при отключенном управлении заданиями, для которых изначально устанавливается стандартный поток ввода /dev/null; команды, для которых применяются следующие перенаправления:
Строка в конце "встроенного документа" должна точно совпадать с маркером; в ней не должно быть начальных или завершающих пробельных символов. |
В любом из вышеописанных перенаправлений можно явно указать перенаправляемый дескриптор файла (т.е. стандартный поток ввода или стандартный поток вывода) путем добавления цифры перед перенаправлением. К аргументам перенаправления файл, маркер и fd применяются подстановки параметров, команд, тильды и арифметические подстановки, а также создание имен файлов. Следует отметить, однако, что результаты создания имен файлов используются только при сопоставлении одного файла; при сопоставлении нескольких файлов используется слово без раскрытия символов создания имен файлов. Кроме того, в ограниченных командных интерпретаторах невозможно использовать перенаправления, создающие файлы.
В случае простых команд перенаправления можно располагать в любом месте; в составных командах (таких как операторы if и др.) все перенаправления следует помещать в конец. Перенаправления обрабатываются после создания конвейеров и в порядке их создания, поэтому команда:
cat /foo/bar 2>&1 > /dev/null | cat -n
выдает ошибку с номером строки, стоящим перед ней.
Целочисленные арифметические выражения можно использовать в сочетании с командой let, в выражениях $((...)), в ссылках на массивы (например, имя[выражение]), в качестве численных аргументов команды test, а также как значения для присвоения целочисленному параметру.
Выражения могут содержать буквенно-цифровые идентификаторы параметров, ссылки на массивы и целочисленные константы. Выражения можно комбинировать со следующими операторами языка C (перечислены и сгруппированы по возрастанию приоритета):
Можно указывать целочисленные константы с произвольными основаниями с помощью нотации основание#число, где основание – десятичное число основания, число – число в указанном основании.
Операторы анализируются следующим образом:
Сопроцесс, т.е. конвейер, созданный посредством оператора |&, представляет собой асинхронный процесс, причем командный интерпретатор может как выполнять запись в него (команда print -p), так и чтение из него (команда read -p). Потоками ввода и вывода сопроцесса можно манипулировать с помощью перенаправлений >&p и <&p соответственно. После запуска одного сопроцесса запустить другой невозможно до завершения работы первого сопроцесса или перенаправления потока ввода сопроцесса посредством перенаправления exec n>&p. Если поток ввода сопроцесса перенаправлен описанным способом, то следующий запускаемый сопроцесс будет совместно использовать поток вывода с первым сопроцессом, если поток вывода исходного сопроцесса не будет перенаправлен с помощью перенаправления exec n<&p.
Некоторые замечания по сопроцессам:
Описанное поведение несколько отличается от поведения исходного командного интерпретатора Korn, который закрывает свою копию компонента записи потока вывода сопроцесса по завершении работы сопроцесса, запущенного последним (а не всех совместно использующих потоки сопроцессов). |
SIGPIPE
при записи, если сигнал не прерывается и не игнорируется, кроме случая, когда поток ввода сопроцесса дублируется в другой дескриптор файла и используется команда print -un.
Функции определяются с использованием синтаксиса командного интерпретатора Korn функция имя или синтаксиса командного интерпретатора Bourne/POSIX имя() (см. описание различий между этими двумя формами далее). Функции похожи на .-сценарии в том, что они выполняются в текущем окружении, однако, в отличие от последних, в пределах функций аргументы командного интерпретатора (т.е. позиционные параметры – $1 и т.д.) являются невидимыми. Когда командный интерпретатор определяет местоположение команды, поиск функций осуществляется после поиска специальных встроенных команд, но до поиска стандартных и нестандартных встроенных команд и поиска по переменной PATH.
Существующую функцию можно удалить командой unset -f имя_функции. Просмотреть список функций можно с помощью команды typeset +f, а список определений функций – с помощью команды typeset -f. С помощью команды autoload (псевдоним команды typeset -fu) можно создавать неопределенные функции; при выполнении неопределенной функции командный интерпретатор выполняет поиск файла с именем, совпадающим с именем функции, по пути, указанному в параметре FPATH, и, если функция найдена, считывает и выполняет ее. Если после выполнения файла обнаруживается, что эта функция определена, то она выполняется, в противном случае продолжается обычный процесс поиска команд (т.е. командный интерпретатор осуществляет поиск по таблице стандартных встроенных команд и в переменной PATH). Следует отметить, что в том случае, если команда не найдена по значению параметра PATH, то командный интерпретатор выполняет попытку автоматической загрузки функции с использованием параметра FPATH (недокументированная функция исходного командного интерпретатора Korn).
Функции могут иметь два атрибута – trace и export, которые устанавливаются с помощью typeset -ft и typeset -fx. При выполнении отслеживаемой функции опция xtrace командного интерпретатора включается на время выполнения функции, в противном случае опция xtrace остается выключенной. Атрибут экспорта в функциях в настоящее время не используется. В исходном командном интерпретаторе Korn экспортированные функции являются видимыми для выполняемых сценариев командного интерпретатора.
Функции выполняются в окружении текущего командного интерпретатора, поэтому присвоения параметров, выполняемые в функциях, становятся видимыми только после выполнения функции. Если такое поведение не требуется, можно создать локальный параметр внутри функции посредством команды typeset. Следует отметить, что обеспечить видимость специальных параметров (таких как $$, $!) таким образом невозможно.
Статусом завершения функции является статус последней команды, выполненной в этой функции. Функцию можно завершить немедленно с помощью команды return; эту команду также можно использовать для явной установки статуса завершения.
Функции, определенные зарезервированным словом function, обрабатываются со следующими отличиями от функций, определенных нотацией ():
В будущем также будут добавлены следующие отличия:
Этот командный интерпретатор разрабатывался как POSIX-совместимый, однако в некоторых случаях поведение в соответствии с POSIX противоречит поведению исходного командного интерпретатора Korn или является неудобным для пользователя. Поведение командного интерпретатора в таких ситуациях определяется состоянием опции posix ( set -o posix); если она установлена, то соблюдаются положения POSIX, в противном случае они не соблюдаются. Если в окружении содержится параметр POSIXLY_CORRECT, то при запуске командного интерпретатора опция posix устанавливается автоматически. (Кроме того, командный интерпретатор может быть скомпилирован таким образом, что он будет работать в режиме POSIX по умолчанию, однако это, как правило, нежелательно.)
Далее приведен список зависимостей от состояния опции posix:
SIGHUP
=1, SIGINT
=2, SIGQUIT
=3, SIGABRT
=6, SIGKILL
=9, SIGALRM
=14, и SIGTERM
=15); в режиме, отличном от POSIX, сигналы можно указывать цифрами в любом случае.
После анализа аргументов командной строки, перенаправлений и присвоений параметров выполняется проверка команды на принадлежность к определенному типу в следующем порядке:
Специальные встроенные команды отличаются от других команд тем, что для их поиска не используется параметр PATH, ошибка при их выполнении может привести к завершению работы неинтерактивного командного интерпретатора, а присвоения параметров, заданные до выполнения команды, после ее выполнения сохраняются. Иными словами, если опция posix выключена (см. описание команды set далее), то некоторые специальные команды проявляют следующую особенность – к аргументам, похожим на присвоения, не применяется разделение на поля, сравнение с шаблонами имен файлов, раскрытие фигурных скобок и замена тильды. Стандартные встроенные команды отличаются только тем, что для их поиска не используется параметр PATH.
Исходный ksh и POSIX несколько отличаются определением специальных и стандартных команд.
В будущем обработка дополнительных специальных и стандартных команд ksh может стать отличной от обработки специальных и стандартных команд POSIX.
После определения типа команды выполняются все присвоения параметров в командной строке, которые экспортируются на протяжении выполнения команды.
Выполнять команды в файле в текущем окружении. Поиск файла осуществляется по каталогам PATH. Если указаны какие-либо аргументы, то при выполнении файла к ним можно обращаться посредством позиционных параметров. Если аргументы не указаны, то позиционные параметры соответствуют этим параметрам в том окружении, в котором используется команда.
Пустая команда. Устанавливается нулевой статус завершения.
При отсутствии аргументов командой alias выводится список всех псевдонимов. Для любого имени без значения выводится существующий псевдоним. Любое имя со значением определяет псевдоним (см. раздел Псевдонимы).
Список псевдонимов представлен в одном из следующих двух форматов.
+
или в командной строке указан только символ +
, то выводится только имя. Кроме того, если указана опция -p, то перед каждым псевдонимом выводится строка alias .
Посредством опции -x устанавливается (опцией +x удаляется) атрибут экспорта псевдонима, или, если не указаны имена, выводится список псевдонимов с атрибутом экспорта (экспорт псевдонима не выполняется).
Опция -t определяет необходимость вывода списка/установки отслеживаемых псевдонимов (для отслеживаемых псевдонимов значения, указанные в командной строке, игнорируются). Опция -r означает, что все отслеживаемые псевдонимы необходимо сбросить.
Опция -d используется для вывода списка или установки псевдонимов каталогов, используемых при замене тильды (см. раздел Замена тильды).
Возобновить выполнение указанного остановленного задания (заданий) в фоновом режиме. Если задания не указаны, используется %+. Эта команда доступна только в системах с поддержкой управления заданиями. Для получения дополнительной информации см. раздел Управление заданиями.
Установить или просмотреть текущую привязку клавиш/макросы emacs. Полное описание приведено в разделе Интерактивная правка строк ввода emacs.
Завершить внутренний цикл for, select, until или while на указанном уровне. По умолчанию значение уровень равно 1.
Выполнить встроенную команду команда. Целесообразно использовать в целях явного выполнения встроенных версий команд (таких как kill), также доступных в виде исполняемых файлов.
Установить каталог как рабочий. Если установлен параметр CDPATH, то выводится путь поиска для каталога, содержащего каталог. Пустой путь указывает на текущий каталог. Если значение каталог отсутствует, то используется основной каталог $HOME. Если каталог имеет значение -
, то используется предыдущий рабочий каталог (см. описание параметра OLDPWD). Если используется опция -L (логический путь) или не установлена опция physical (см. описание команды set далее), то ссылки на ..
в каталоге являются относительными по отношении к пути, используемому для перехода к этому каталогу. Если указана опция -P (физический путь) или установлена опция physical, то ..
является относительным по отношению к дереву каталогов файловой системы. Параметры PWD и OLDPWD обновляются для обеспечения соответствия текущему и предыдущему рабочим каталогам соответственно.
cd [-LP] старый новый
Строка новый подставляется вместо строки старый в текущем каталоге, и командный интерпретатор пытается перейти к новому каталогу.
Если не указана опция -v или -V, то команда выполняется так, как если бы команда command не была вызвана, с двумя исключениями:
Если указана опция -p, то вместо текущего значения PATH используется путь поиска по умолчанию. Фактическое значение пути по умолчанию зависит от системы: в системах POSIX оно соответствует значению, возвращенному командой:
getconf _CS_PATH
Если указана опция -v, то вместо выполнения команды выводится информация об исполняемом объекте (это же действие выполняется для аргумента ...): для специальных и стандартных встроенных команд и функций выводятся их имена, для псевдонимов выводится определяющая их команда, для команд, найденных в результате поиска по параметру PATH, выводится полный путь к команде. Если команда не найдена, (т.е. поиск пути завершился неуспешно), то информация не выводится и команда command завершает работу со статусом завершения, отличным от нуля. Опция -V аналогична опции -v, только уровень вывода подробной информации будет более высоким.
Перейти к началу цикла for, select, until или while на указанном уровне. По умолчанию значение уровень равно 1.
Вывести аргументы (с разделением пробелами) в стандартный поток вывода, после каждого аргумента добавить символ новой строки. Если любой из аргументов содержит управляющую последовательность (с обратной косой чертой) \c, то символ новой строки подавляется. Список других распознаваемых управляющих последовательностей с обратной косой чертой приведен в описании команды print далее.
Опции, реализованные для совместимости со сценариями командного интерпретатора BSD: -n – подавление завершающего символа новой строки, -e – включение интерпретации обратной косой черты (холостая команда, поскольку, как правило, так и происходит), -E – подавление интерпретации обратной косой черты.
Эта команда также доступна как исполняемый файл; см. описание команды echo.
Конкатенация аргументов (с пробелами между ними) для формирования одной строки, синтаксис которой затем анализируется командным интерпретатором, и строка выполняется в текущем окружении.
Выполнить команду без создания порожденного процесса системным вызовом fork(), с заменой процесса командного интерпретатора.
Если аргументы не указаны, любое перенаправление ввода-вывода будет фиксированным, и командный интерпретатор не заменяется. Любые дескрипторы файлов более 2, открываемые или дублируемые (dup) таким образом, не будут доступными для других выполняемых команд (т.е. команд, не встроенных в командный интерпретатор). Следует отметить, что в командном интерпретаторе Bourne имеется отличие: он не передает эти дескрипторы файлов.
Завершение работы командного интерпретатора с указанным статусом завершения. Если статус не указан, то статусом завершения будет текущее значение параметра ?
.
Установить атрибут экспорта для указанных параметров. Экспортированные параметры передаются выполняемым командам в соответствующее окружение. Если значения указаны, то дополнительно выполняется присвоение указанных параметров.
Если параметры не указаны, то выводится список всех параметров с атрибутом экспорта по одному на строке. Если указана опция -p, то в этом случае выводится список команд export, определяющих все экспортируемые параметры, с соответствующими значениями.
Команда, завершающая работу со статусом, отличным от нуля.
Эта команда также доступна как исполняемый файл; см. раздел false.
Аргументы первый и последний используются для выбора команд в истории. Можно выбрать команды по номеру в истории или ввести строку, указывающую на последнюю команду, начинающуюся с этой строки. При использовании опции -l список команд выводится в стандартный поток вывода stdout, опция -n подавляет номера команд по умолчанию. Опция -r изменяет порядок в списке на противоположный. Если опция -l не указана, то выполняется правка выбранных команд в редакторе, указанном в опции -e, а если опция -e не задана, то в редакторе, указанном в параметре FCEDIT (если этот параметр также не установлен, используется /bin/ed
), после чего эти команды выполняются командным интерпретатором.
fc [-e - | -s] [-g] [старый=новый] [префикс]
Повторное выполнение выбранной команды (по умолчанию – предыдущей команды) после выполнения дополнительной подстановки значения новый вместо старый. Если указана опция -g, то все вхождения значения старый заменяются на значение новый. Вызов этой команды обычно выполняется с предварительно определенным псевдонимом:
r='fc -e -'
Возобновить выполнение указанного задания (заданий) в приоритетном режиме. Если задания не указаны, используется %+. Эта команда доступна только в системах с поддержкой управления заданиями. Для получения дополнительной информации см. раздел Управление заданиями.
Команда getopts используется процедурами для синтаксического анализа указанных аргументов (или позиционных параметров, если аргументы не указаны) и проверки корректности опций. Аргумент доп_строка содержит дополнительные буквы, которые должны распознаваться командой getopts. Если за буквой следует двоеточие, то для опции следует указать аргумент. Опции, для которых не требуется указывать аргументы, можно сгруппировать в один аргумент. Если для какой-либо опции требуется указать аргумент и символ опции не является последним символом аргумента, в котором он находится, то остальная часть аргумента считается аргументом опции, в противном случае аргументом опции будет следующий аргумент.
Каждый раз при вызове команда getopts помещает следующую опцию в параметр командного интерпретатора с указанным именем, а индекс следующего обрабатываемого аргумента – в параметр командного интерпретатора OPTIND. Если опция начинается со знака +
, то перед опцией, указанной аргументом имя, указывается префикс +
. Если для опции требуется указать аргумент, то команда getopts помещает его в параметр командного интерпретатора OPTARG. При обнаружении некорректной опции или отсутствующего аргумента в параметр имя помещается вопросительный знак или двоеточие (означающие некорректную опцию или отсутствие аргумента соответственно), и для параметра OPTARG устанавливается значение символа опции, являющегося причиной проблемы. Если значение доп_строка начинается не с двоеточия, то в стандартный поток ошибок выводится сообщение об ошибке.
При достижении конца набора опций команда getopts завершает работу со статусом завершения, отличным от нуля. Набор опций считается законченным, когда встречается первый аргумент, не являющийся опцией и не начинающийся с символа -
, или аргумент --.
Для сброса синтаксического анализа опций можно установить для OPTIND значение 1 (при вызове командного интерпретатора или его процедуры это действие выполняется автоматически).
Изменение значения параметра командного интерпретатора OPTIND на значение, отличное от 1, или продолжение синтаксического анализа аргументов без сброса параметра OPTIND может привести к непредвиденным результатам. |
При отсутствии аргументов – вывести список путевых имен хэшированных исполняемых команд. Если опция -r указана, то все хэшированные команды удаляются из хэш-таблицы. Если указаны какие-либо имена, то командный интерпретатор выполняет поиск каждого из них как имени команды; если имя соответствует исполняемой команде, то оно добавляется в хэш-таблицу.
Вывести информацию об указанных заданиях; если задания не указаны, отображаются все задания. Если указана опция -n, то выводится информация только по тем заданиям, статус которых изменился с момента последнего уведомления. Если указана опция -l, то дополнительно выводится идентификатор каждого процесса в задании. Если указана опция -p, то выводятся только группы процессов каждого задания. Для получения информации о формате задания и выводимого задания см. раздел Управление заданиями.
Послать указанный сигнал указанным заданиям, идентификаторам процессов или группам процессов. Если сигнал не указан, то посылается сигнал TERM
. Если указано задание, то сигнал посылается группе процессов этого задания. Для получения информации о формате задания см. раздел Управление заданиями.
kill -l [статус_завершения ...]
Вывести имя сигнала, уничтожившего процесс, который завершил работу с указанными статусами завершения. Если аргументы не указаны, выводится список всех сигналов с номерами и краткими описаниями.
Эта команда также доступна как исполняемый файл; см. описание команды kill.
Проанализировать каждое из указанных выражений (см. раздел Арифметические выражения). Если все выражения успешно проанализированы, устанавливается следующий статус завершения:
Если при синтаксическом анализе или анализе выражения возникла ошибка, то значение статуса завершения будет больше 1.
Поскольку для выражений может потребоваться экранирование, для let "выражение" можно использовать синтаксисический прием (( выражение )).
Вывести аргументы в стандартный поток вывода с разделением пробелами. После аргументов добавить символы новой строки. Если указана опция -n, то символ новой строки подавляется. По умолчанию выполняется трансляция некоторых управляющих последовательностей из языка C. Транслируются следующие управляющие последовательности: \b, \f, \n, \r, \t, \v и \0### (# является восьмеричной цифрой и может принимать значения от 0 до 3). Применение \c эквивалентно использованию опции -n. С помощью опции -r можно запретить раскрытие обратной косой черты. Если указана опция -s, то вывод направляется в файл истории (не в стандартный поток вывода), если указана опция -u – в дескриптор файла n (если значение n не указано, используется значение по умолчанию 1), если указана опция -p – в сопроцесс (см. раздел Сопроцессы).
Опция -R используется для эмуляции (в определенной степени) команды "echo" в BSD, которая обрабатывает последовательности с символом \ только в том случае, если указана опция -e. Как и в предыдущем случае, опция -n подавляет завершающий символ новой строки.
Вывести текущий рабочий каталог. Если указана опция -L или не установлена опция physical (см. описание команды set ниже), то выводится логический путь (т.е. путь, используемый для перехода в текущий каталог посредством команды cd). Если указана опция -P (физический путь) или установлена опция physical, то выводится путь, определенный на основе файловой системы (путем перехода по каталогам ..
в корневой каталог).
Эта команда также доступна как исполняемый файл; см. описание команды pwd.
Считать строку ввода из стандартного потока ввода, разделить строку на поля с использованием параметра IFS (см. раздел Подстановка) и присвоить значение каждого поля указанным параметрам. Если параметров больше, чем полей, то оставшимся параметрам присваивается пустое значение; если полей больше, чем параметров, то значения оставшихся полей присваиваются последнему параметру (включая все разделительные пробелы). Если параметры не указаны, используется параметр REPLY. Если строка ввода заканчивается обратной косой чертой и опция -r не указана, то обратная косая черта и символ новой строки удаляются и считываются следующие входные данные. Если данные не были считаны, работа команды read завершается с ненулевым статусом завершения.
В качестве первого параметра можно указать строку с вопросительным знаком перед ней; в этом случае указанная строка используется как приглашение (выводится в стандартный поток ошибок перед чтением любых входных данных), если устройством ввода является терминал ввода-вывода (например, read nfoo?'number of foos: ').
Если указаны опции -un и -p, то входные данные считываются из дескриптора файла n или текущего сопроцесса (подробное описание см. в разделе Сопроцессы) соответственно. Если указана опция -s, то входные данные сохраняются в файл истории.
Установить для указанных параметров атрибут "только для чтения". Если указаны значения, то они присваиваются параметрам до установки этого атрибута. Значение параметра с атрибутом "только для чтения" невозможно сбросить или изменить.
Если параметры не указаны, то выводится список всех параметров с атрибутом "только для чтения" по одному на строке. Если указана опция -p, то в этом случае выводится список команд readonly, определяющих все параметры "только для чтения", с соответствующими значениями.
Вернуть результат функции или .-сценария со статусом завершения статус. Если статус не указан, используется статус завершения последней выполненной команды. При использовании вне функции или .-сценария действие этой команды аналогично действию команды exit. Следует отметить, что ksh обрабатывает профиль и файлы $ENV
как .-сценарии, тогда как исходный командный интерпретатор Korn обрабатывает как .-сценарии только профили.
С помощью команды set можно устанавливать (-
) и отключать (+
) опции командного интерпретатора, определять позиционные параметры и устанавливать параметры-массивы. Синтаксис изменения опций может быть следующим: +-o опция, где опция – полное имя опции; __+-__буква, где буква – однобуквенное имя опции (предусмотрено не для всех опций). В следующей таблице приведены обе буквы опции (если они существуют), полные имена и описания действий, выполняемых при использовании этих опций.
Буква / Полное имя / Описание:
Эти опции также можно использовать при вызове командного интерпретатора. Текущий набор опций (с короткими именами из одной буквы) можно просмотреть с помощью параметра -
. Команда set -o без имени опции выводит список всех опций с информацией о том, активирована или деактивирована каждая из них; команда set +o выводит длинные имена всех опций, активированных в данный момент.
Остальные аргументы (при наличии) являются позиционными параметрами и присваиваются в соответствующем порядке позиционным параметрам (т.е. 1, 2 и т.д.). Если опции оканчиваются символом --, а остальные аргументы отсутствуют, удаляются значения всех позиционных параметров. Если опции или аргументы не заданы, то выводятся значения всех имен. По неизвестным историческим причинам опция -
обрабатывается особым образом: она отменяет опции -x и -v.
Имена позиционных параметров номер+1, номер+2 ... изменяются на 1, 2 и т.д. По умолчанию значение номер равно 1.
или:
[ выражение ]
Проанализировать выражение и вернуть статус 0, если оно истинно, статус 1, если оно ложно, и статус больше 1 в случае ошибки. Как правило, используется в качестве команды условия для операторов if и while.
Вызов исполняемого файла test является распространенной ошибкой. Если путь к файлу не указан, выполняется встроенная команда. |
Доступны следующие элементарные выражения:
Описанные выше элементарные выражения, в которых приоритет унарных операторов выше, чем приоритет бинарных операторов, можно объединить с помощью следующих операторов (список приведен по возрастанию приоритета):
В операционных системах без поддержки устройств /dev/fd/n
(n соответствует номеру дескриптора файла) команда test осуществляет попытку создать фиктивное устройство для всех тестов, выполняемых для файлов (кроме -e). Таким образом, тестирование [ -w /dev/fd/2 ] завершается успешно, если дескриптор файла 2 доступен для записи.
Обратите внимание на то, что если число аргументов для test или [ ... ] меньше пяти, применяются специальные правила (согласно POSIX): если ведущие аргументы ! можно удалить и оставить только один аргумент, выполняется тестирование длины строки (даже если аргумент является унарным оператором); если ведущие аргументы ! можно удалить и оставить три аргумента, из которых второй является бинарным оператором, то выполняется бинарная операция (даже если первый аргумент является унарным оператором, включая оставленные аргументы !).
Распространенной ошибкой является использование команды if [ $foo = bar ], которая завершается неуспешно в случае, если значение foo является пустым или отсутствует, если имеются вложенные пробелы (т.е. символы IFS) либо если это унарный оператор, например, ! или -n. Вместо этого следует использовать тестирование типа if [ "X$foo" = Xbar ]. |
Вывести суммарное время работы пользователя и системы, используемое командным интерпретатором и процессами, завершившими работу при запуске интерпретатора.
Установить обработчик trap-файлов, который требуется запускать при получении какого-либо из указанных сигналов.
Аргумент обработчик является либо пустой строкой, указывающей на то, что сигналы игнорируются, либо минусом (-
), указывающим на то, что при получении сигналов выполняется действие по умолчанию (см. signal()), либо строкой с командами интерпретатора для анализа и выполнения при первой возможности (т.е. по завершении выполнения текущей команды или перед выводом следующего приглашения PS1) после получения одного из сигналов.
Значение аргумента сигнал соответствует имени сигнала (например, SIGPIPE
или SIGALRM
) или номеру сигнала (см. описание команды kill -l). Существует два специальных сигнала:
Обработчики EXIT запускаются в среде последней выполненной команды. Обратите внимание на то, что в неинтерактивных командных интерпретаторах обработчик trap-файлов невозможно изменить для сигналов, которые были проигнорированы при запуске интерпретатора.
Без аргументов команда trap выводит, как если была выполнена серия команд trap, список с информацией о текущем состоянии trap-файлов, установленных с момента запуска командного интерпретатора.
Trap-файл DEBUG исходного командного интерпретатора Korn и обработка trap-файлов ERR и EXIT в настоящее время в функциях не реализованы. |
Команда, завершающая работу со статусом, отличным от нуля.
Эта команда также доступна как исполняемый файл; см. описание команды true.
Показать или установить атрибуты параметров. Без аргументов имя отображаются атрибуты параметров: если опции не используются, то текущие атрибуты всех параметров выводятся как команды typeset; если задана какая-либо опция (или -
без буквы опции), выводятся все параметры и их значения с указанными атрибутами; если опции вводятся с символом +
, то значения параметров не выводятся.
Если указаны аргументы имя, то атрибуты соответствующих параметров устанавливаются (-
) или удаляются (+
). Дополнительно можно указать значения параметров. Если в функции используется команда typeset, то все новые параметры являются локальными для функции.
При использовании опции -f команда typeset выполняется для атрибутов функций. Как и в случае параметров, если не указаны аргументы имя, то функции отображаются в списке с соответствующими значениями (т.е. определениями). Если опции вводятся с символом +
, то отображаются только имена функций.
Опции:
Показать или установить предельные значения процесса. Если опции не используются, устанавливается предельное значение размера файла (-f). Возможными значениями являются арифметическое выражение или слово unlimited. Установленные предельные значения влияют на работу командного интерпретатора и все созданные им процессы. Следует отметить, что в некоторых системах увеличить предельные значения после установки невозможно. Также необходимо учитывать, что возможные типы предельных значений зависят от конкретных систем. В некоторых системах доступно только ограничение -f.
Опции:
Показать или установить маску создания полномочий доступа к файлу или маску umask (см. описание umask). Если используется опция -S, отображается или устанавливается символьная маска, в противном случае маска является восьмеричным числом.
Эта команда также доступна как исполняемый файл; см. описание команды umask.
Символьные маски аналогичны маскам, используемым при выполнении команды chmod:
[ugoa]{{=+-}{rwx}*}+[,...]
в котором первая группа символов описывает кто, вторая группа описывает оператор, а последняя группа – полномочия. Группа кто определяет, какую часть umask требуется изменить. Значения букв:
Группа оператор определяет способ изменения полномочий группы кто:
Группа полномочия определяет, какие полномочия требуется установить, добавить или удалить:
Используемые символьные маски описывают возможные полномочия (в противоположность восьмеричным маскам, в которых установленный бит означает, что соответствующий бит должен быть удален). Например, при установке маски ug=rwx,o= файлы будут недоступны для чтения, записи или выполнения "другими" пользователями. Эта маска эквивалентна восьмеричной маске (в большинстве систем) 07.
Удалить псевдонимы для соответствующих имен. При использовании опции -a удаляются все псевдонимы. При использовании опции -t или -d указанные операции выполняются для отслеживаемых псевдонимов или псевдонимов каталогов соответственно.
Сбросить указанные параметры (по умолчанию, -v) или функции (-f). Статус завершения отличен от нуля, если какой-либо из параметров уже был сброшен. В противном случае устанавливается нулевой статус.
Ожидать завершения указанного задания (заданий). Статус завершения команды wait соответствует статусу последнего указанного задания: если последнее задание уничтожено сигналом, то устанавливается статус завершения 128 + номер сигнала (см. описание kill -l статус_завершения); если найти последнее указанное задание не удалось (поскольку оно не существует или уже завершено), устанавливается статус завершения 127. Описание формата аргумента задание приведено в разделе Управление заданиями. Команда wait возвращает результат при получении сигнала, для которого было установлено прерывание, либо при получении сигнала SIGHUP
, SIGINT
или SIGQUIT
.
Если задания не указаны, то команда wait ожидает завершения всех выполняемых в настоящее время заданий (при наличии) и завершает работу с нулевым статусом. Если активирован мониторинг заданий, выводится статус завершения заданий (этот статус не выводится, если задания указаны явно).
Для каждого имени выводится тип команды (зарезервированное слово, встроенная команда, псевдоним, функция, отслеживаемый псевдоним или исполняемый файл команды). При использовании опции -p поиск по пути выполняется даже в случае, если имя является зарезервированным словом, псевдонимом и т.д. Без опции -v результат выполнения команды whence аналогичен command -v, за исключением того, что whence находит зарезервированные слова и не выводит псевдонимы как команды; с использованием опции -v результат выполнения команды whence аналогичен command -V. Обратите внимание на то, что ввод опции -p для команды whence не влияет на используемый путь поиска, как для команды command. Если определить тип одного или нескольких имен невозможно, то статус завершения будет отличен от нуля.
Управление заданиями означает возможность командного интерпретатора осуществлять мониторинг и управление заданиями, которые представляют собой процессы или группы процессов, созданные для команд или конвейеров. Как минимум, интерпретатор отслеживает статус существующих фоновых (т.е. асинхронных) заданий; для просмотра этой информации используется команда jobs. Если активированы все аспекты управления заданиями (с помощью команды set -m или set -o monitor), как для интерактивных интерпретаторов, то процессы задания помещаются в собственную группу процессов с возможностью остановки выполнения приоритетных заданий путем ввода символа приостановки с терминала (как правило, Ctrl - Z
) и перезапуска заданий в приоритетном или фоновом режиме с помощью команд fg и bg. При остановке или перезапуске приоритетного задания сохраняется или восстанавливается информация о состоянии терминала.
Следует обратить внимание, что можно остановить только те команды, которые создают процессы (например, асинхронные команды, команды порожденного командного интерпретатора и невстроенные команды, не относящиеся к функциям); остановить команды типа read невозможно.
При создании заданию присваивается номер. Для интерактивных интерпретаторов этот номер выводится в скобках [...], а после него указываются идентификаторы процессов в задании (в случае выполнения асинхронной команды). В команды fg, bg, jobs, kill и wait можно добавлять ссылки на задания с помощью идентификатора последнего процесса в конвейере команд (в соответствии со значением параметра $!) или путем добавления знака процента в виде префикса к номеру задания (%). Для обращения к заданиям также используются другие последовательности с символом процента:
При изменении состояния задания (например, при завершении фонового задания или остановке приоритетного) интерпретатор выводит следующую информацию о статусе:
[номер] флаг статус команда
Поля:
SIGTSTP
). При попытке завершения работы интерпретатора в случае наличия остановленных заданий командный интерпретатор выдает пользователю предупреждение о том, что существуют остановленные задания, при этом работа интерпретатора не завершается. В случае незамедлительного повтора попытки завершения работы остановленным заданиям передается сигнал SIGHUP
, после чего интерпретатор завершает работу. Аналогичным образом, если опция nohup не указана и существуют задания в процессе выполнения, то при попытке завершения работы начального командного интерпретатора пользователю выдается соответствующее предупреждение, при этом работа командного интерпретатора не завершается. В случае незамедлительного повтора попытки завершения работы выполняемым заданиям передается сигнал SIGHUP
, после чего интерпретатор завершает работу.
Опция emacs активирует интерактивную правку строк ввода.
Этот режим несколько отличается от режима emacs в исходном интерпретаторе Korn; в режиме emacs 8-й бит удаляется. |
В этом режиме при выполнении различных команд правки (как правило, с привязкой к одному или нескольким управляющим символам) незамедлительно запускаются определенные действия без ожидания новой строки. При вызове интерпретатора создается привязка нескольких команд правки к определенным управляющим символам; для изменения этой привязки используются следующие команды:
ESC
и Ctrl - X
), также предусмотрена поддержка некоторых последовательностей из большего числа символов. В результате выполнения следующих команд создается привязка кнопок со стрелками на ANSI-терминале или xterm (привязка по умолчанию). Разумеется, не все управляющие последовательности обеспечивают такой эффективный результат: bind '^[['=prefix-2
bind '^XA'=up-history
bind '^XB'=down-history
bind '^XC'=forward-char
bind '^XD'=backward-char Ниже перечислены команды правки. Каждое описание начинается с имени команды, значения n (если для команды можно использовать префикс счетчика), после которых приведены клавиши, привязанные к команде по умолчанию (записанные с помощью символа вставки, например, символ ASCII ESC записывается как ^[). Префикс счетчика для команды можно ввести с помощью последовательности ^[n, где n представляет собой последовательность из 1 или нескольких цифр; если значение счетчика не указано, по умолчанию используется 1, если не определено иное. Обратите внимание на то, что имена команд правки используются только с командой bind. Кроме того, многие команды правки целесообразно выполнять только на терминалах с режимом видимости курсора. Были выбраны привязки по умолчанию, похожие на соответствующие привязки клавиш emacs. Символы пользователя терминала ввода-вывода (например, ERASE), привязаны к очевидным подстановкам и переопределяют привязки по умолчанию.
^G
^B
^[B
^[<
^A
^[c
или ^[C
^[^[
или ^I
^X^[
^[^X
^[=
ERASE
, ^?
, ^H
^[ERASE
, ^[^?
, ^[^H
, ^[h
^[d
^N
^[L
, ^[l
^[>
^E
^_
^D
^X^X
^[*
^F
^[f
^[g
KILL
^W
^K
^[?
^X?
^X^Y
^J
, ^M
^O
QUIT
^[
^X
, ^[[
^[.
, ^[_
^^
^L
^[^]
^]
^R
^
в строке поиска создает "закладку" поиска. При нажатии клавиши выхода выполняется выход из режима поиска. Другие команды выполняются после выхода из режима поиска. При последовательном выполнении нескольких команд search-history поиск продолжается в обратном направлении до следующего вхождения шаблона. В буфере истории сохраняется только конечное число строк; наиболее давние игнорируются по мере необходимости. ^[клавиша пробела
^T
^P
^[U
, ^[u
^V
^Y
^[y
~/.profile
/etc/profile
/etc/suid_profile
Базовые подсистемы ЗОСРВ «Нейтрино», UNIX, POSIX
chmod, esh, fesh, gawk, getconf, sed, sh, stty, uesh, umask
dup(), errno, execve(), getgid(), getopt(), getuid(), open(), pipe(), rand(), signal(), system(), wait()
IEEE Standard for Information Technology — Portable Operating System Interface (POSIX) — Part 2: Shell and Utilities, IEEE Inc, 1993, ISBN 1-55937-255-9.
Предыдущий раздел: Утилиты