Главная > Программирование > Bash Bash - командная оболочка2004 г
Брайан Фокс (Brian Fox), Free Software Foundation,Чет Реми (Chet Ramey), Case Western Reserve University перевод В. Кравчук ПЕРЕНАПРАВЛЕНИЕПеред выполнением команды ее входной и выходной потоки могут быть перенаправлены с помощью специальных конструкций, обрабатываемых командным интерпретатором. Перенаправления также можно использовать для открытия и закрытия файлов в текущей среде работы командного интерпретатора. Следующие операторы перенаправления могут предшествовать простой команде или указываться в любом ее месте, или указываться после команды. Перенаправления обрабатываются в порядке их указания, слева направо. В следующих описаниях если номер дескриптора файла не указан и первый символ оператора перенаправления - <, выполняется перенаправление стандартного входного потока (дескриптор файла 0). Если же первым символом оператора перенаправления является символ >, выполняется перенаправление стандартного выходного потока (дескриптор файла 1). В слове, идущем за оператором перенаправления в следующих описаниях, если не сказано иначе, выполняется подстановка фигурных скобок, замена тильды, подстановка значений параметров, подстановка результатов выполнения команд, вычисление арифметических выражений, удаление кавычек и подстановка имен файлов. Если в результате получается более одного слова, командный интерпретатор bash выдает сообщение об ошибке. Учтите, что порядок указания перенаправлений имеет значение. Например, команда
перенаправляет в файл dirlist стандартный выходной поток и стандартный поток ошибок, тогда как команда
перенаправляет в файл dirlist только стандартный выходной поток, поскольку стандартный поток ошибок был направлен туде же, куда и стандартный выходной поток до его перенаправления в файл dirlist. Ошибка при открытии или создании файла приводит к отмене перенаправления. Перенаправление входного потокаПеренаправление входного потока приводит к открытию на чтение файла, имя которого получается в результате подстановок в слове, через дескриптор файла n, или как стандартного входного потока (дескриптор файла 0), если n не указано. В общем случае перенаправление входного потока имеет вид:
Перенаправление выходного потокаПеренаправление входного потока приводит к открытию на запись файла, имя которого получается в результате подстановок в слове, через дескриптор файла n, или как стандартного выходного потока (дескриптор файла 1), если n не указано. Если файл не существует, он создается; если существует - он усекается до нулевого размера. В общем случае перенаправление выходного потока имеет вид:
Если используется оператор перенаправления > и с помощью встроенной команды set установлена опция noclobber, перенаправление не будет выполнено, если файл с соответствующим именем существует и является обычным файлом. Если используется оператор перенаправления >|, либо оператор перенаправления - > и опция noclobber с помощью встроенной команды set не установлена, перенаправление выполняется, даже если соответствующий файл существует. Добавление перенаправленного выводаТакое перенаправление вывода приводит к открытию файла, имя которого получается в результате подстановок в слове, в режиме добавления через дескриптор файла n, или к добавлению в стандартный выходной поток (дескриптор файла 1) если n не указано. Если файл не существует, он создается. Перенаправление вывода на добавление имеет следующий общий вид:
Перенаправление стандартного выходного потока и стандартного потока ошибокКомандный интерпретатор bash позволяет перенаправить как стандартный выходной поток (дескриптор файла 1), так и стандартный поток ошибок (дескриптор файла 2) в файл, имя которого получается в результате подстановок в слове. Для этого предлагается два формата конструкции перенаправления:
Первый формат является предпочтительным. Эта конструкция семантически эквивалентна следующей:
Конструкция "документ здесь"При этом типе перенаправления командный интерпретатор будет читать входные данные из текущего файла, пока не встретится строка, содержащая только указанное слово (без хвостовых пробелов). Все прочитанные до этого строки затем используются как стандартный входной поток для команды. Конструкция "документ здесь" имеет следующий формат:
В слове не выполняется подстановка значений параметров, результатов выполнения команд, имен файлов или вычисление арифметических выражений. Если в слове есть замаскированный символ, ограничитель является результатом удаления символов маскировки из слова. Если в слове нет замаскированных символов, во всех строках "документа здесь" выполняется подстановка значений параметров, результатов выполнения команд и вычисление арифметических выражений. В этом случае пара \<перевод строки> игнорируется, и необходимо использовать \ для маскировки символов \, $ и `. Если в качестве оператора перенаправления используется <<-, то все начальные табуляции из входных строк и строки, содержащей ограничитель, удаляются. Это позволяет естственным образом выравнивать конструкции "документ здесь" в сценариях командного интерпретатора. Дублирование дескрипторов файловОператор перенаправления
используется для дублирования дескрипторов входных файлов. Если в результате подстановок слово представляет собой одну или несколько цифр, дескриптор файла n становится копией соответствующего дескриптора файла. Если файл с дескриптором, задаваемым цифрами слова, не открыт на чтение, возникает ошибка перенаправления. Если после подстановок в слове получается -, файл с дескриптором n закрывается. Если n не указано, используется стандартный входной поток (дескриптор файла 0). Оператор
используется аналогично для дублирования дескрипторов выходных файлов. Если n не указано, используется стандартный выходной поток (дескриптор файла 1). Если цифры в слове не задают дескриптор файла, открытого на запись, возникает ошибка перенаправления. В качестве специального случая, если n не указано и слово после подстановок не представляет собой одну или несколько цифр, стандартный выходной поток и стандартный поток ошибок перенаправляются так, как было описано выше. Открытие дескрипторов файлов для чтения и записиОператор перенаправления
вызывает открытие файла, имя которого получается в результате подстановок в слове, для чтения и записи через дескриптор файла n или через дескриптор файла 0, если n не указано. Если файл не существует, он создается. ПСЕВДОНИМЫПсеводнимы позволяют подставлять вместо первого слова простой команды строку. Командный интерпретатор поддерживает список псевдонимов, которые можно устанавливать и удалять с помощью встроенных команд alias и unalias (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Первое слово каждой команды, если оно не взято в кавычки, ищется в списке псевдонимов. Если соответствующий псевдоним найден, слово заменяется текстом псевдонима. Имя псевдонима и подставляемый текст может включать любые допустимые входные данные для командного интерпретатора, включая перечисленные ранее метасимволы. Единственное исключение - имя псевдонима не может содержать знак =. Первое слово текста псевдонима также ищется в списке псевдонимов, но если оно совпадает с именем подставляемого псевдонима, повторной подстановки не происходит. Это означает, что можно задать псевдоним ls для ls -F, например, и bash не будет пытаться выполнять рекурсивные подстановки в тексте псевдонима. Если последний символ текста псевдонима - пробел, следующее за псевдонимом слово исходной команды также ищется в списке псевдонимов и, если найдено, заменяется. Псевдонимы создаются и просматриваются с помощью комадны alias, а удаляются с помощью команды unalias. Нет механизма передачи аргументов в подставляемый текст. Если необходимы аргументы, используйте функцию командного интерпретатора. Псевдонимы не подставляются, если командный интерпретатор не является интерактивным, если только с помощью встроенной команды shopt не установлена опция expand_aliases (см. описание команды shopt ниже, в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА"). Правила определения и использования псевдонимов несколько запутаны. Командный интерпретатор bash всегда читает по крайней мере одну полную строку ввода, прежде чем выполнять любые указанные в ней команды. Псевдонимы подставляются при чтении строки, а не при ее выполнении. Поэтому определение псевдонима, заданное в одной строке с другой командой, не учитывается, пока не будет прочитана следующая строка. Команды, идущие после определения псевдонима в той же строке, этот новый псевдоним не учитывают. Это поведение также необходимо учитывать при выполнении функций. Псевдонимы подставляются при чтении определения функции, а не при ее выполнении, поскольку определение функции само является составной командой. Как следствие, псевдонимы, определенные в функции, не доступны до тех пор, пока функция не выполнится. Для простоты, всегда задавайте определения псевдонимов в отдельной строке и не используйте команду alias в составных командах. Практически все варианты использования псевдонимов покрываются функциями командного интерпретатора. ФУНКЦИИФункция командного интерпретатора, определенная как было представлено ранее в разделе "СИНТАКСИС КОМАНД", сохраняет под заданным именем последовательность команд для выполнения в дальнейшем. Функции выполняются в контексте текущего командного интерпретатора; для их интерпретации не создается новый процесс (сравните с выполнением сценария командного интерпретатора). При вызове функции ее аргументы становятся позиционными параметрами. Специальный параметр # обновляется, отражая это изменение. Позиционный параметр 0 не изменяется. Все остальные особенности среды выполнения командного интерпретатора у функции и вызывающей ее команды идентичны, только обработчик сигнала DEBUG (см. описание встроенной команды trap в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже) не наследуется. Можно объявлять локальные переменные функции с помощью встроенной команды local. Обычно переменные и их значения совместно используются функцией и вызвавшей ее командой. Если в функции выполняется встроенная команда return, эта функция завершается, и выполнение продолжается со следующей команды после вызова функции. Когда функция завершается, восстанавливаются значения позиционных параметров и специального параметра #, которые были до выполнения функции. Имена и определения функций можно получить с помощью опции -f встроенных команд declare или typeset. С опцией -F встроенные команды declare и typeset будут выдавать только имена функций. Функции можно экспортировать, с помощью опции -f встроенной команды export, так что они будут автоматически определены в порожденных командных интерпретаторах. Функции могут быть рекурсивными. Глубина рекурсии не ограничена. ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙКомандный интерпретатор в определенных случаях обеспечивает вычисление арифметических выражений (см. встроенную команду let и подраздел "Подстановка арифметических выражений" ранее). Вычисление выполняется в длинных целых числах без проверки переполнения, хотя деление на 0 перехватывается и выдается соответствующее сообщение об ошибке. Операторы в следующем списке сгруппированы по уровням с одинаковым приоритетом. Уровни перечислены в порядке убывания приоритета.
В качестве операндов можно использовать переменные командного интерпретатора; перед вычислением выполняется подстановка значений параметров. Значение параметра в арифметическом выражении приводится к длинному целому. Чтобы переменную командного интерпретатора можно было использовать в арифметических выражениях, ее атрибут integer устанавливать не обязательно. Константы с начальным 0 интерпретируются как восьмеричные числа. Начальные 0x или 0X обозначают шестнадцатеричную константу. В остальных случаях числа имеют вид [основание#]n, где основание - десятичное число от 2 до 64, представляющее основание системы счисления, а n - число в этой системе счисления. Если основание не указано, используется основание 10. Цифры, большие 9, представляются строчными буквами, прописными буквами, символами _ и @, именно в таком порядке. Если основание меньше или равно 36, прописные и строчные буквы эквивалентны и используются для представления чисел от 10 до 35. Операторы вычисляются в порядке приоритетов. Сначала вычисляются подвыражения в круглых скобках, которые позволяют переопределить представленные выше стандартные приоритеты операторов. УСЛОВНЫЕ ВЫРАЖЕНИЯУсловные выражения используются составной командой [[ и встроенными командами test и [ для проверки атрибутов файла и выполнения строковых и арифметических сравнений. Выражения формируются из следующих унарных и бинарных элементарных условий. Если любой из аргументов файл в одном из условий имеет вид /dev/fd/n, проверяется файл с дескриптором n.
ОБРАБОТКА ПРОСТОЙ КОМАНДЫПри обработке простой команды командный интерпретатор делает, слева направо, следующие подстановки, присваивания и перенаправления.
Если в результате имени команды нет, присваивания переменным влияют на среду текущего командного интерпретатора. В противном случае, переменные добавляются в среду выполняемой команды и не влияют на среду текущего командного интерпретатора. Если происходит попытка присвоить значение переменной с атрибутом только для чтения, выдается сообщение об ошибке и команда завершается с ненулевым статусом выхода. Если в результате имени команды нет, перенаправления выполняются, но не влияют на среду текущего командного интерпретатора. При ошибке перенаправления команда завершается с ненулевым статусом выхода. Если после подстановок имя команды осталось, выполнение продолжается так, как описано ниже. В противном случае, выполнение команды завершается. При этом если выполнялись подстановки результатов выполнения команд, статус выхода будет равен статусу последней команды, результаты которой были подставлены. Если подстановок результатов выполнения команд не было, команда завершается со статусом выхода ноль. ВЫПОЛНЕНИЕ КОМАНДЫПосле разбиения команды на слова, если в результате получилась простая команда с необязательным списком аргументов, выполняются следующие действия.
Если имя команды не содержит сиволов косой черты, командный интерпретатор пытается ее найти. Если существует функция командного интерпретатора с таким именем, она вызывается как было описано выше в разделе "ФУНКЦИИ". Если же функции с таким именем нет, командный интерпретатор ищет ее в списке встроенных команд. Если такая встроенная команда есть, она выполняется. Если имя не является именем функции или именем встроенной команды и не содержит пробелы, командный интерпретатор bash просматривает каждый каталог в значении переменной PATH в поисках выполняемого файла с соответствующим именем. Для запоминания полных имен выполняемых файлов bash использует хэш-таблицу (см. описание команды hash в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее). Полный поиск по каталогам в PATH выполняется только если команда не найдена в этой хэш-таблице. Если команда при таком поиске не найдена, командный интерпретатор выдает соответствующее сообщение и завершает выполнение команды со статусом выхода 127. Если команда найдена или имя команды содержит косые черты, командный интерпретатор выполняет соответствующую команду в отдельной среде выполнения. Аргумент 0 устанавливается равным имени команды, и ей передаются параметры, соответствующие аргументам в командной строке, если они заданы. Если выполнить команду не удалось, потому что файл не соответствует поддерживаемым выполняемым форматам, и этот файл не является каталогом, предполагается, что файл является сценарием командного интерпретатора, содержащим его команды. Для его выполнения запускается порожденный командный интерпретатор. Этот порожденный командный интерпретатор переинициализируется, как если бы для обработки сценария был вызван новый командный интерпретатор, но только местонахождения команд, запомненные родительским интерпретатором (см. описание команды hash ниже в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА"), передаются порожденному. Если текст в файле начинается с #!, остаток первой строки задает интерпретатор для программы. Командный интерпретатор запускает указанный интерпретатор в операционных системах, которые не поддерживают соответствующий формат выполняемого файла непосредственно. Этому интерпретатору в качестве аргументов передается один необязательный аргумент, затем имя интерпретатора из первой строки программы, затем имя самой программы и ее аргументы, если они заданы. СРЕДА ВЫПОЛНЕНИЯ КОМАНДУ командного интерпретатора есть среда выполнения, содержащая следующие компоненты:
Когда необходимо выполнить команду, не являющуюся встроенной или функцией командного интерпретатора, она вызывается в отдельной среде выполнения, состоящей из указанных ниже компонентов. Если не указано иначе, все значения наследуются от командного интерпретатора.
Команда, вызванная в этой отдельной среде, не может повлиять на среду выполнения родительского командного интерпретатора. Команды, результаты которых необходимо подставить, и асинхронные команды вызываются в средах порожденных командных интерпретаторов, которые совпадают со средой родительского, но обработчки сигналов устанавливаются такие, как были унаследованы родительским командным интерпретатором при вызове. Встроенные команды, вызываемые как часть конвейера, также выполняются в среде порожденного командного интерпретатора. Изменения в среде порожденного командного интерпретатора не затрагивают среду выполнения родительского. СРЕДАПри вызове программы ей передается массив строк, который называют средой. Это список пар имя-значение вида name=value. Командный интерпретатор позволяет манипулировать средой несколькими способами. При вызове командный интерпретатор просматривает свою среду и создает одноименный параметр для каждого имени, автоматически экспортируя его для порожденных процессов. Выполняемые команды наследуют среду. Команды export и declare -x позволяют добавлять и удалять параметры и функции из среды. Если значение параметра, входящего в среду, изменено, новое значение становится частью среды, заменяя старое. Среда, наследуемая выполняемой командой, состоит из начальной среды командного интерпретатора, значения которой могли быть изменены в ходе его работы, за исключением пар, удаленных с помощью команды unset, и новых параметров, добавленных с помощью команд export и declare -x. Среда для любой простой команды или функции может быть временно дополнена путем задания перед именем присваиваний параметрам, как описано ранее в разделе "ПАРАМЕТРЫ". Эти операторы присваивания влияют только на среду вызываемой команды. Если установлена опция -k, (см. описание встроенной команды set ниже), то все параметры с присвоенными при вызове значениями, а не только предшествующие имени команды, помещаются в ее среду. Когда командный интерпретатор bash вызывает внешнюю команду, переменная _ устанавливается равной полному имени файла команды и передается этой команде в среде. СТАТУС ВЫХОДАС точки зрения командного интерпретатора, команда, завершившаяся со статусом выхода 0, сработала успешно. Статус выхода 0 означает успешное завершение. Ненулевой статус выхода означает неудачу. Если работа команды прервана сигналом, командный интерпретатор bash использует в качестве статуса выхода значение 128+сигнал. Если команда не найдена, порожденный для ее выполнения процесс возвращает статус выхода 127. Если команда найдена, но не является выполняемой, возвращается статус выхода 126. Если команда не сработала, поскольку ошибка произошла при подстановках или перенаправлениях, возвращается положительный статус выхода. Встроенные команды интерпретатора возвращают статус 0 (истина) при успешном выполнении, и ненулевой статус (ложь), если при выполнении произошла ошибка. При некорректном использовании все встроенные команды возвращают статус 2. Сам командный интерпретатор bash возвращает статус выхода последней выполненной команды, если только не обнаруживает синтаксическую ошибку. В этом случае он завершает работу с ненулевым статусом. См. также описание встроенной команды exit ниже. СИГНАЛЫКогда командный интерпретатор bash работает в интерактивном режиме, при отсутствии обработчиков сигналов, он игнорирует сигнал SIGTERM (так что команда kill 0 не прекращает работу интерактивного командного интерпретатора), а сигнал SIGINT перехватывается и обрабатывается (так, что встроенная команда wait им не прерывается). Во всех случаях, bash игнорирует сигнал SIGQUIT. Если действует управление заданиями, bash игнорирует сигналы SIGTTIN, SIGTTOU и SIGTSTP. У синхронных заданий, запущенных командным интерпретатором bash, устанавливаются обработчики сигналов, унаследованные командным интерпретатором от родительского процесса. Если управление заданиями не действует, асинхронные команды также игнорируют сигналы SIGINT и SIGQUIT. Команды, выполняемые для подстановки результатов выполнения, игнорируют сигналы управления заданиями SIGTTIN, SIGTTOU и SIGTSTP, посланные с клавиатуры. По умолчанию командный интерпретатор завершает работу при получении сигнала SIGHUP. Перед завершением он посылает сигналы SIGHUP всем заданиям, как выполняющимся, так и остановленным. Остановленным заданиям предварительно посылается сигнал SIGCONT, гарантирующий получение ими сигнала SIGHUP. Для предотвращения послыки интерпретатором сигнала конкретному заданию, его необходимо удалить из таблицы заданий с помощью встроенной команды disown (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее) или пометить как не получающие сигнал SIGHUP с помощью disown -h. Если с помощью команды shopt установлена опция командного интерпретатора huponexit, bash посылает сигнал SIGHUP всем заданиям при завершении работы интерактивного начального командного интерпретатора. При получении командным интерпретатором bash сигнала, для которого установлен обработчик, в то время, когда ожидается завершение команды, обработчик не выполняется, пока команда не завершится. Когда bash ожидает завершения асинхронной команды с помощью встроенной команды wait, получение сигнала, для которого установлен обработчик, приводит к немедленному завершению встроенной команды wait со статусом выхода более 128 сразу же после выполнения кода обработчика. УПРАВЛЕНИЕ ЗАДАНИЯМИУправление заданиями - это возможность избирательно останавливать (приостанавливать) выполнение процессов и продолжать (возобновлять) их выполнение в дальнейшем. Пользователи обычно делают это через интерактивный интерфейс, совместно реализуемый драйвером терминала и командным интерпретатором bash. Командный интерпретатор связывает задание с каждым конвейером. Он поддерживает таблицу выполняющихся заданий, которую можно просматривать с помощью команды jobs. При запуске задания асинхронно (в фоновом режиме) bash выдает строку следующего вида:
показывающую, что это задание с номером 1, а идентификатор последнего процесса в конвейере, связанном с данным заданием - 25647. Все процессы в одном конвейере являются частями одного задания. Командный интерпретатор bash использует понятие задания как основу для управления заданиями. Для упрощения реализации пользовательского интерфейса для управления заданиями система поддерживает понятие идентификатора группы процессов текущего терминала. Члены этой группы процессов (процессы, идентификатор группы процессов которых равен идентификатору группы процессов терминала) получают сигналы с клавиатуры, например, сигнал SIGINT. Эти процессы называют приритетными (процессами переднего плана). Фоновые процессы - это те, идентификатор группы процессов которых не совпадает с терминальным; таким процессам сигналы с клавиатуры не посылаются. Только приоритетные процессы могут читать данные с терминала и выдавать данные в него. Фоновые процессы, пытающиеся читать с терминала (или выдавать в него данные) получают от драйвера терминала сигнал SIGTTIN (SIGTTOU), который, если не перехвачен, приостанавливает работу процесса. Если операционная система, в которой работает bash, поддерживает управление заданиями, bash позволяет его использовать. При нажатии клавиши приостановки (обычно ^Z, Control-Z) по ходу работы процесса, этот процесс останавливается и управление возвращается командному интерпретатору bash. При нажатии клавиши отложенной приостановки (обычно ^Y, Control-Y) процесс останавливается при попытке чтения данных с терминала, и управление возвращается командному интерпретатору bash. Затем пользователь может управлять состоянием этого задания, используя команду bg для его продолжения в фоновом режиме, команду fg - для продолжения в приоритетном режиме или команду kill для его прекращения. Нажатие ^Z срабатывает немедленно и имеет дополнительный побочный эффект в виде сброса данных, ожидающих вывода и ввода. Командный интерпретатор поддерживает несколько способов сослаться на задание. Символ % означает начало имени задания. На задание с номером n можно сослаться как %n. На задание можно сослаться также с помощью префикса имени команды, использованной для его начала, или подстроки, входящей в соответствующую командную строку. Например, %ce ссылается на остановленное задание ce. Если префикс соответствует нескольким заданиям, bash выдает сообщение об ошибке. Обращение вида %?ce, с другой стороны, ссылается на любое задание, в командной строке которого содержится подстрока ce. Если эта подстрока содержится в нескольких заданиях, bash выдает сообщение об ошибке. Строки %% и %+ обозначают текущее задание командного интерпретатора - последнее задание, остановленное при работе в приоритетном режиме или запущенное в фоновом режиме. На предыдущее задание можно сослаться с помощью строки %-. В результатах работы команд, связанных с управлением заданиями, (в частности, в результатах выполнения команды jobs), текущее задание всегда помечается знаком +, а предыдущее - знаком -. Для перевода задания в приоритетный режим достаточно ввести только его имя: %1 - это синоним для команды "fg %1", переводящей задание 1 из фонового в приоритетный режим. Аналогично, команда "%1 &" продолжает работу задания 1 в фоновом режиме и эквивалентна команде "bg %1". Об изменении состояния задания командный интерпретатор узнает сразу. Обычно bash информирует об изменениях в состоянии заданий при выдаче очередного приглашения, чтобы не прерывать этой информацией выдачу любых других результатов. Если с помощью встроенной команды set установлена опция -b, bash информирует о таких изменениях немедленно. Если при наличии остановленных заданий происходит попытка выхода из bash, командный интерпретатор выдает соответствующее предупреждение. Затем с помощью команды jobs можно проверить состояние этих заданий. Если сразу же выполняется повторная попытка завершить работу, командный интерпретатор не выдает предупреждения и остановленные задания прекращаются. ПРИГЛАШЕНИЯПри интерактивной работе командный интерпретатор bash выдает первичное приглашение, PS1, когда он готов к вводу команды, и вторичное приглашение, PS2, когда для завершения команды необходимы дополнительные данные. Командный интерпретатор bash позволяет настраивать эти строки приглашения с помощью ряда маскируемых обратной косой специальных символов со следующими значениями:
Порядковый номер команды и порядковый номер команды в списке истории обычно различаются: порядковый номер в списке истории задает ее позицию в списке, который может содержать команды, прочитанные из файла истории (см. раздел "ИСТОРИЯ ВЫПОЛНЕНИЯ КОМАНД" далее), тогда как порядковый номер команды задает ее позицию в списке команд, выполненных в текущем сеансе командного интерпретатора. После декодирования строки приглашения в ней выполняется подстановка значений параметров, подстановка результатов выполнения команд, результатов вычисления арифметических выражений, подстановка строк и удаление кавычек, в зависимости от значения опции командного интерпретатора promptvars (см. описание команды shopt в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" далее). БИБЛИОТЕКА READLINEЭто библиотека, обрабатывающая входные данные при работе командного интерпретатора в интерактивном режиме, если при его вызове не была указана опция --noediting. По умолчанию, команды редактирования строки подобны используемым в редакторе emacs. Также предоставляется интерфейс для редактирования командной строки в стиле редактора vi. Для отключения возможности редактирования после запуска командного интерпретатора используются опции +o emacs или +o vi встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Соглашения по записи команд readlineВ этом разделе для записи нажимаемых клавиш используются соглашения в стиле редактора emacs. Управляющие клавиши обозначаются C-клавиша, так что C-n сокращенно обозначает Control-N. Аналогично, метаклавиши обозначаются M-клавиша, так что M-x обозначает Meta-X. (На клавиатурах, где нет клавиши meta, M-x обозначает ESC x, т.е. нажать клавишу Escape и затем нажать клавишу x. Тем самым, клавиша ESC реализует префикс meta. Комбинация M-C-x обозначает ESC-Control-x, или нажать клавишу Escape, затем, удерживая клавишу Control, нажать клавишу x.) Команды библиотеки readline могут иметь числовые аргументы, обычно обозначающие количество повторений. Иногда, однако, они являются признаком значимости аргумента. Передача отрицательного аргумента команде, работающей с дальнейшим текстом (например, kill-line) приводит к ее применению к предшествующему тексту. Команды, работа которых отличается от описанной здесь, специально отмечены ниже. Если команда удаляет текст, этот текст сохраняется для дальнейшего извлечения (вставки). Удаленый текст помещается в кольцевой буфер. Последовательные удаления пополняют буфер, формируя единицу вставки. Команды, не удаляющие текст, разделяют фрагменты в кольцевом буфере удаления. Инициализация библиотеки readlineБиблиотека readline настраивается с помощью команд в файле инициализации (файл inputrc). В качестве имени этого файла берется значение переменной INPUTRC. Если эта переменная не установлена, используется стандартный файл, ~/.inputrc. При запуске программы, использующей библиотеку readline, файл инициализации читается и устанавливаются соответствующие переменные и горячие клавиши. В файле инициализации readline допускаются лишь несколько простых конструкций. Пустые строки игнорируются. Строки, начинающиеся символом #, являются комментариями. Строки, начинающиеся символом $, обозначают условные конструкции. Остальные строки обозначают установки горячих клавиш и присваивания значений переменным. Стандартные горячие клавиши можно изменить в файле inputrc. Другие программы, использующие эту библиотеку, могут добавлять собственные команды и горячие клавиши. Например, поместив в файл инициализации
мы привязываем к комбинации клавиш M-C-u команду universal-argument библиотеки readline. Распознаются следующие имена символов: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE и TAB. Кроме имен команд, библиотека readline позволяет привязывать к клавишам строки, которые будут вставляться при их нажатии (т.е. задвать макроподстановки). Горячие клавиши readlineПривязки клавиш в файле inputrc задаются с помощью простого синтаксиса. Необходимо указать только имя команды или текст макроподстановки, и горячие клавиши, с которыми его надо связать. Горячие клавиши можно задавать двумя способами: как символическое имя клавиши, возможно, с префиксом Meta- или Control-, или как комбинацию клавиш. При использовании формы имя_клавиши:имя_функции или макроподстановка, имя_клавиши просто задается на английском. Например:
В этом примере комбинация клавиш C-u связывается с функцией universal-argument, M-DEL - с функцией backward-kill-word, а C-o - с макроподстановкой, указанной в правой части (т.е. приведет к вставке текста > output в строку). Во второй форме, "комбинация_клавиш":имя_функции или макроподстановка, комбинация клавиш отличается от использованного выше имени клавиши тем, что может задаваться в двойных кавычках. При этом можно использовать некоторые управляющие символы в стиле GNU Emacs, как в следующем примере.
В этом примере, комбинация клавиш C-u опять связывается с функцией universal-argument. Комбинация C-x C-r связывается с функцией re-read-init-file, а комбинация ESC [ 1 1 ~ будет приводить к вставке текста Function Key 1. Полный набор управляющих последовательностей в стиле GNU Emacs представлен ниже.
Помимо управляющих последовательностей в стиле GNU Emacs, имеется еще один набор управляющих последовательностей, начинающихся с обратной косой:
При вводе текста макроподстановки необходимо для ее обозначения указывать одиночные или двойные кавычки. Текст без кавычек считается именем функции. В теле макроподстановки интерпретируются перечисленные выше управляющие последовательности, начинающиеся с обратной косой. Обратная косая маскирует любой другой символ в тексте макроподстановки, в том числе, символы " и '. Командный интерпретатор bash позволяет просмотреть или изменить текущие горячие клавиши библиотеки readline с помощью встроенной команды bind. Режим редактирования можно переключать в ходе интерактивной работы с помощью опции -o встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Переменные readlineБиблиотека readline поддерживает переменные, которые можно использовать для дополнительной настройки ее работы. Значение переменной можно установить в файле inputrc или с помощью оператора вида
За исключением явно указанных случаев, переменные readline могут иметь значения On или Off. Ниже представлены эти переменные и их стандартные значения:
Управляющие конструкции readlineБиблиотека readline реализует средства, аналогичные по духу возможностям условной компиляции препроцессора языка C и позволяющие назначать горячие клавиши или присваивать значения переменным в зависимости от условий. Поддерживается четыре директивы анализатора.
ПоискБиблиотека readline предлагает команды для поиска в списке истории команд (см. раздел "ИСТОРИЯ ВЫПОЛНЕНИЯ КОМАНД" ниже) строк, содержащих определенную подстроку. Имеется два режима поиска: инкрементный и не инкрементный. Инкрементные поиски начинаются прежде, чем пользователь закончит ввод искомой строки. Привводе каждого символа искомой строки, readline выдает следующую запись из списка истории, соответствующую уже набранной подстроке. При инкрементном поиске достаточно ввести ровно столько символов, сколько надо для нахождения интересующей команды. Символы значения переменной isearch-terminators используются для завершения инкрементного поиска. Если значение этой переменной не задано, инкрементный поиск прерывается клавишами Escape и Control-J. Нажатие Control-G прерывает инкрементный поиск и восстанавливает исходную строку. При завершении поиска, запись из списка истории, содержащая строку поиска, становится текущей строкой. Для поиска других соответствующих записей в списке истории, нажмите Control-S или Control-R, в зависимости от направления поиска. В результате, будет выполнен поиск в обратном или прямом направлении следующей записи, соответствующей уже набранному фрагменту строки. Ввод любой другой последовательности символов, привязанной к команде библиотеки readline, приводит к завершению поиска и выполнению команды. Например, нажатие клавиши Enter завершит поиск и выполнит выбранную команду из списка истории. При неинкрементом поиске перед началом поиска читается вся искомая строка. Искомая строка может быть набрана пользователем или быть частью содержимого текущей строки. Имена команд readlineНиже представлен список имен команд и стандартные комбинации клавиш, к которым они привязаны. Имена команд, для которых не указана комбинация клавиш, по умолчанию ни к какой комбинации не привязаны. Команды для перемещения
Команды для работы со списком истории
Команды для изменения текста
Удаление и вставка
Числовые аргументы
Завершение
Клавиатурные макросы
Прочие команды
Главная > Программирование > Bash |