Главная > Программирование > Bash Bash - командная оболочка2004 г
Брайан Фокс (Brian Fox), Free Software Foundation,Чет Реми (Chet Ramey), Case Western Reserve University перевод В. Кравчук НАЗВАНИЕbash - командный интерпретатор GNU Bourne-Again SHell СИНТАКСИС
АВТОРСКИЕ ПРАВАКомандный интерпретатор bash создан Фондом свободно распространяемого программного обеспечения. Copyright (C) 1989-1999 by the Free Software Foundation, Inc. ОПИСАНИЕbash - это sh-совместимый интерпретатор командного языка, выполняющий команды, прочитанные со стандартного входного потока или из файла. Командный интерпретатор bash также включает полезные средства командных интерпретаторов Korn и C (ksh и csh). Командный интерпретатор bash создавался как соответствующий спецификации командного интерпретатора и инструментальных средств IEEE POSIX (IEEE POSIX Shell and Tools specification) (IEEE Working Group 1003.2). ОПЦИИПомимо однобуквенных опций командного интерпретатора, представленных в описании встроенной команды set, bash интерпретирует при вызове следующие опции:
Командный интерпретатор bash также интерпретирует несколько многосимвольных опций. Эти опции, чтобы они были распознаны, должны указываться в командной строке перед односимвольными опциями.
АРГУМЕНТЫЕсли после обработки опций остались аргументы и не указаны опции -c или -s, первый аргумент считается именем файла, содержащего команды интерпретатора. Если bash вызван таким образом, параметр $0 устанавливается равным имени файла, а значениями позиционных параметров становятся другие аргументы. Командный интерпретатор bash читает и выполняет команды из этого файла, а затем завершает работу. Статусом выхода bash является статус выхода последней команды, выполненной в сценарии. Если ни одна команда не выполнена, статус выхода - 0. ВЫЗОВНачальный командный интерпретатор (login shell) - это интерпретатор, первый символ нулевого аргумента которого является дефисом (-) или который запущен с опцией --login. Интерактивным является командный интерпретатор, стандартный входной и выходной потоки которого подключены к терминалам (что определяется с помощью функции isatty(3)), или запущенный с опцией -i. Переменная среды PS1 устанавливается и флаги ($-) включают i, только если bash является интерактивным интерпретатором, что позволяет проверить это в файле начального запуска или в сценарии командного интерпретатора. Следующие абзацы описывают, как bash выполняет свои файлы начального запуска. Если любой из этих файлов существует, но не может быть прочитан, bash выдает сообщение об ошибке. Символы тильды (~) в именах файлов заменяются так, как описано в подразделе "Замена тильды" раздела "ЗАМЕНЫ". При вызове bash как интерактивного начального командного интерпретатора, или как неинтерактивного интерпретатора с опцией --login, он сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он последовательно ищет файлы ~/.bash_profile, ~/.bash_login и ~/.profile, читает и выполняет команды из первого же из них, который существует и доступен на чтение. Опция --noprofile может использоваться при запуске командного интерпретатора, чтобы отменить это действие. При завершении работы в качестве начального командного интерпретатора bash читает и выполняет команды в файле ~/.bash_logout, если он существует. При запуске интерактивного командного интерпретатора, не являющегося начальным, bash читает и выполняет команды из файла ~/.bashrc, если он существует. Это действие можно отменить с помощью опции --norc. Опция --rcfile файл заставляет bash читать и выполнять команды из указанного файла вместо ~/.bashrc. При неинтерактивном запуске bash, например, для выполнения сценария, командный интерпретатор ищет в среде переменную BASH_ENV, получает ее значение и использует его в качестве имени файла, который необходимо прочитать и выполнить. bash ведет себя так, как если бы была выполнена следующая команда:
но при поиске имени файла не используется значение переменной PATH. Если bash вызван с именем sh, он пытается, наколько это возможно, имитировать поведение при запуске старых версий интерпретатора sh, соответствуя при этом стандарту POSIX. При вызове в качестве интерактивного начального командного интерпретатора или неинтерактивного, но с опцией --login, он сначала пытается читать и выполнять команды последовательно из файлов /etc/profile и ~/.profile. Для отмены этого действия можно использовать опцию --noprofile. При вызове в качестве интерактивного командного интерпретатора с именем sh, bash ищет переменную среды ENV, получает ее значение, если оно задано, и использует это значение в качестве имени файла, который необходимо прочитать и выполнить. Поскольку интерпретатор, вызванный как sh, не пытается читать и выполнять команды в других файлах начального запуска, опция --rcfile не действует. Неинтерактивный командый интерпретатор, вызванный с именем sh, не пытается читать и выполнять никакие файлы начального запуска. При вызове по имени sh, командный интерпретатор bash входит в режим posix после прочтения файлов начального запуска. При запуске bash в режиме posix, например, с помощью опции командной строки --posix, он следует стандарту POSIX при работе с файлами начального запуска. В этом режиме интерактивные командные интерпретаторы берут значение переменной среды ENV, читают и выполняют команды из соответствующего файла. Никакие другие файлы начального запуска не читаются. Командный интерпретатор bash пытается определить, не запущен ли он демоном удаленного командного интерпретатора, обычно, rshd. Если оказывается, что bash запущен демоном rshd, он читает и выполняет команды из файла ~/.bashrc, если этот файл существует и доступен на чтение. Командный интерпретатор bash так не делает, если запущен как sh. Для отмены этого действия можно использовать опцию --norc, а с помощью опции --rcfile можно заставить читать другой файл, но обычно демон rshd не задает эти опции командному интерпретатору и не позволяет их указать. Если командный интерпретатор запущен с эффективным идентификатором пользователя (группы), не совпадающим с реальным идентификатором пользователя (группы), и не указана опция -p, файлы начального запуска не читаются, функции командного интерпретатора не наследуются из среды, переменная SHELLOPTS, если она задана в среде, игнорируется, а эффективный идентификатор пользователя устанавливается равным реальному. Если при вызове задана опция -p, файлы начального запуска тоже не читаются, но эффективный идентификатор пользователя не сбрасывается. ОПРЕДЕЛЕНИЯВ оставшейся части документа используются следующие термины.
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВАЗарезервированными являются слова, имеющие специальное значение для командного интерпретатора. Следующие слова распознаются как зарезервированные, если не замаскированы и являются либо первым словом простой команды (см. "СИНТАКСИС КОМАНД" ниже), либо третьим словом команды case или for: ! case do done elif else esac fi for function if in select then until while { } time [[ ]]СИНТАКСИС КОМАНДПростые командыПростая команда - это завершающаяся управляющим оператором последовательность необязательных присваиваний значений переменным, после которых идут слова, разделенные пробелами, и перенаправления потоков. Первое слово задает команду, которую надо выполнить. Оставшиеся слова передаются как аргументы вызванной команде. Возвращаемым значением простой команды является ее статус выхода, или 128+n, если команда завершена сигналом n. КонвейерыКонвейер - это последовательность одной или более команд, разделенных символом |. Конвейер имеет следующий формат:
Стандартный выходной поток команды связывается со стандартным входным потоком команды2. Эта связь выполняется раньше, чем любые перенаправления, задаваемые командой (см. "ПЕРЕНАПРАВЛЕНИЕ" ниже). Если перед конвейером указано зарезервированное слово !, статус выхода такого конвейера является логическим отрицанием статуса выхода последней команды. В противном случае, статус выхода конвейера совпадает со статусом выхода последней команды. Прежде, чем возвращать значение, командный интерпретатор ждет завершения всех команд в конвейере. Если перед конвейером идет зарезервированное слово time, после завершения конвейера выдается общее, пользовательское и системное время, потраченное на его выполнение. Опция -p изменяет формат вывода на задаваемый стандартом POSIX. Переменная TIMEFORMAT может задавать строку формата выдачи информации о времени; см. описание переменной TIMEFORMAT в разделе "Переменные командного интерпретатора" ниже. Каждая команда в конвейере выполняется как отдельный процесс (т.е. в порожденном интерпретаторе). СпискиСписок - это последовательность одного или более конвейеров, разделенных одним из операторов ;, &, && или ||, и не обязательно завершающаяся одним из операторов ;, & или <перевод строки>. Из этих операторов списка && и || имеют равный приоритет, причем больший, чем ; и &, тоже имеющие равный приоритет. Если команда завершается управляющим оператором &, интерпретатор выполняет команду в фоновом режиме в порожденном интерпретаторе. Командный интерпретатор не ждет завершения команды, а статус выхода в этом случае - 0. Команды, разделенные ; выполняются последовательно; командный интерпретатор ждет поочередно завершения каждой из команд. Статус возврата списка в этом случае совпадает со статусом возврата последней выполненной команды. Управляющие операторы && и || обозначают, соответственно, И-списки и ИЛИ-списки. И-список имеет вид
Команда2 выполняется только и если только команда вернула статус выхода ноль. ИЛИ-список имеет вид
Команда2 выполняется только и если только команда вернула ненулевой статус выхода. И- и ИЛИ-списки возвращают статус последней команды, выполненной в списке. Составные командыСоставными называют следующие команды:
КОММЕНТАРИИВ неинтерактивном командном интерпретаторе или в интерактивном с включенной опцией interactive_comments встроенной команды shopt (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже), слово, начинающиеся символом #, влечет игнорирование этого слова и последующих символов в строке. Интерактивный командный интерпретатор с не включенной опцией interactive_comments не допускает использования комментариев. Опция interactive_comments по умолчанию включается в интерактивных командных интерпретаторах. МАСКИРОВКАМаскировка (quoting) используется для отмены специального значения для командного интерпретатора определенных символов или слов. Маскировку можно использовать для отмены специфической обработки специальных символов, для предотвращения распознавания зарезервированных слов, а также для предотвращения подстановки параметров. Каждый из метасимволов, перечисленных выше в разделе "ОПРЕДЕЛЕНИЯ", имеет специальное значение для командного интерпретатора и должен маскироваться, если используется буквально. Имеется три механизма маскировки: символ маскировки (escape character), одиночные кавычки и двойные кавычки. Незамаскированная обратная косая черта (\) является символом маскировки. Он требует использовать следующий за ним символ (за исключением перевода строки) буквально. Если введена пара символов \<перевод строки> и сама обратная косая не замаскирована, эта пара обрабатывается как признак продолжения строки (т.е. она удаляется из входного потока и, по сути, игнорируется). Все символы в одиночных кавычках используются буквально. Символ одиночной кавычки (апостроф) не должен указываться между одиночными кавычками, даже если он предваряется обратной косой. Символы в двойных кавычках используются буквально, за исключением символов $, ` и \. Символы $ и ` в двойных кавычках имеют то же специальное значение. Обратная косая имеет специальное значение только если после нее идет один из следующих символов: $, `, ", \ или <перевод строки>. Двойную кавычку можно указывать в двойных кавычках, замаскировав обратной косой. Специальные параметры * и @ имеют специальное значение при указании в двойных кавычках (см. раздел "ПАРАМЕТРЫ" ниже). Слова вида $'строка' обрабатываются особым образомy. Слово заменяется строкой, в которой предваренные обратной косой символы заменяются в соответствии со стандартом ANSI C. Управляющие последовательности, начинающиеся с обратной косой, декодируются следующим образом:
Преобразованный результат помещается в одиночные кавычки, как если бы символа доллара просто не было. Строка в двойных кавычках, перед которой идет символ доллара ($), будет преобразована в соответствии с текущей локалью. Если текущая локаль - C или POSIX, символ доллара игнорируется. Если строка преобразована и заменена, результат помещается в двойные кавычки.
Главная > Программирование > Bash |