- bash
-
GNU Bourne-Again SHell
Типичная сессия в bashТип Автор Брайан Фокс (Brian Fox)
Разработчик Чет Рамей (Chet Ramey)
Написана на Операционная система Языки интерфейса Английский, мультиязычный (gettext)
Последняя версия 4.2 (13 февраля 2011 года)
Лицензия Сайт bash (от англ. Bourne again shell, каламбур «Born again» shell — «Возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.
Bash — это командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне. Bash также может читать команды из файла, который называется скриптом (или сценарием). Как и все Unix-оболочки, он поддерживает автодополнение названий файлов и папок, подстановку вывода результата команд, переменные, контроль за порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh. Другие функции, например, история, были скопированы с csh и ksh. Bash в основном удовлетворяет стандарту POSIX, но с рядом расширений[1].
Название «bash» является акронимом от Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.
Содержание
Отличия в синтаксисе
Подавляющее большинство важных скриптов командного процессора Bourne могут выполняться без изменения в bash, за исключением тех, которые ссылаются на специальные переменные Bourne или используют встроенные команды Bourne. Синтаксис команд Bash включает идеи, заимствованные у Korn shell (ksh) и C shell (csh), такие как редактирование командной строки, история команд, стек каталогов, переменные
$RANDOM
и$PPID
, синтаксис замены команды$(…)
. Когда Bash используется как интерактивный командный процессор, он поддерживает автозавершение имён программ, файлов, переменных и т. п. с помощью клавиши Tab ⇆ .Внутренние команды
Ввод/вывод echo
выводит выражение или содержимое переменной (на stdout) printf
команда форматированного вывода, расширенный вариант команды echo
read
«читает» значение переменной со стандартного ввода (stdin), в интерактивном режиме это клавиатура Файловая система cd
изменяет текущий каталог pwd
выводит название текущего рабочего каталога (от англ. print working directory) Действия над переменными let
производит арифметические операции над переменными eval
транслирует список аргументов из списка в команды set
изменяет значения внутренних переменных скрипта unset
удаляет переменную (фактически устанавливает её значение в null) export
экспортирует переменную, делая её доступной дочерним процессам declare
,typeset
задают и/или накладывают ограничения на переменные getopts
используется для разбора аргументов, передаваемых скрипту из командной строки Управление сценарием source
,.
(точка)запуск указанного сценария exit
безусловное завершение работы сценария exec
заменяет текущий процесс новым, запускаемым командой exec
shopt
позволяет изменять ключи (опции) оболочки на лету Команды true
возвращает код завершения ноль (успешное завершение) false
возвращает код завершения, который свидетельствует о неудаче type prog
выводит полный путь к prog hash prog
запоминает путь к prog help COMMAND
выводит краткую справку по использованию внутренней команды COMMAND Скрипты
В простейшем случае, скрипт — простой список команд, записанный в файл. Командный процессор должен знать, что он должен этот файл обработать, а не просто прочесть его содержимое. Для этого служит специальная конструкция, называемая shebang (англ.):
#!
. Символ#
задаёт комментарий, но в данном случает shebang означает, что после этого спецсимвола находится путь к интерпретатору для исполнения сценария.Синтаксис
Синтаксис команд bash — это расширенный синтаксис команд Bourne shell. Окончательная спецификация синтаксиса команд Bash есть в Bash Reference Manual, распространяемом проектом GNU.[2]
«Hello world»
#!/usr/bin/env bash echo Hello World!
Этот скрипт содержит только две строки. Первый сообщает системе о том, какая программа используется для запуска файла. Вторая строка — это единственное действие, которое выполняется этим скриптом, он собственно печатает 'Hello world!' в терминале.
Запуск скрипта
Для того, чтобы скрипт стал исполняемым, могут быть использованы следующие команды:
chmod +rx scriptname # выдача прав на чтение/исполнение любому пользователю chmod u+rx scriptname # выдача прав на чтение/исполнение только "владельцу" скрипта
Из соображений безопасности, путь к текущему каталогу «
.
» не включен в переменную окружения$PATH
. Поэтому для запуска скрипта необходимо явно указывать путь к текущему каталогу, в котором находится скрипт:./scriptname
Перенаправление ввода-вывода
В bash есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr).
- stdout — стандартный вывод программы.
- stdin — стандартный ввод. То, что набирает пользователь в консоли.
- stderr — стандартный вывод ошибок.
Для операций с этими дескрипторами, существуют специальные символы:
>
(перенаправление вывода),<
(перенаправление ввода). Символ&
означает указатель на дескриптор 1 (stdout).1>filename
Перенаправление вывода в файл «filename», файл перезаписывается поступающими данными 1>>filename
Перенаправление вывода в файл «filename», данные добавляются в конец файла 2>filename
Перенаправление стандартного вывода ошибок в файл «filename» 2>>filename
Перенаправление стандартного вывода ошибок в файл «filename», данные добавляются в конец файла &>filename
Перенаправление вывода и ошибок в файл «filename» 2>&1
Перенаправление вывода ошибок на стандартный вывод Bash имеет индивидуальный синтаксис перенаправления, который не поддерживается в Bourne shell. Пример одновременного перенаправления стандартного вывода и стандартных ошибок:
command &> file
это проще набрать, чем эквивалентную команду в синтаксисе Bourne shell
command > file 2>&1
Поддерживается heredoc-синтаксис:
command <<MYDOC123 многострочный текст MYDOC123
Начиная с версии 2.05b, bash может перенаправлять стандартный ввод из строки, используя следующий синтаксис «here strings»:
command <<< "string to be read as standard input"
Если строка содержит пробелы, её следует взять в кавычки.
Пример (перенаправление стандартного вывода в файл, запись данных, закрытие файла, сброс stdout):
# make Filedescriptor(FD) 6 a copy of stdout (FD 1) exec 6>&1 # open file "test.data" for writing exec 1>test.data # produce some content echo "data:data:data" # close file "test.data" exec 1>&- # make stdout a copy of FD 6 (reset stdout) exec 1>&6 # close FD6 exec 6>&-
Открытие и закрытие файлов:
# open file test.data for reading exec 6<test.data # read until end of file while read -u 6 dta do echo "$dta" done # close file test.data exec 6<&-
Захват вывода внешних команд:
# выполнить 'find' и поместить результат в VAR # поиск файлов, которые заканчиваются на "h" VAR=$(find . -name "*h")
Условный оператор
#!/usr/bin/env bash T1="foo" T2="bar" if [ "$T1" = "$T2" ]; then echo условие выполняется else echo условие не выполняется fi
Циклы
#!/usr/bin/env bash for i in `seq 1 10`; do echo $i done
#!/usr/bin/env bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done
#!/usr/bin/env bash i=0 until [ $i -eq 10 ] do echo $i i=$[$i+1] done
Массивы
Индексированные массивы
Bash имеет поддержку одномерных массивов. Инициализировать элементы массива можно в виде:
my_array[xx]
. Также можно явно объявить массив в сценарии, с помощью директивыdeclare
:declare -a my_array
Обращаться к отдельным элементам массива можно с помощью фигурных скобок, то есть:
${my_array[xx]}
.Инициализировать индексированный массив можно двумя способами:
1)
Array=(element1 element2 element3)
2)
temp_array[0]=element1 temp_array[5]=element temp_array[9]=elementN
Добавление элементов в конец индексированного массива:
declare -a arrAnimals arrAnimals=(dog elephant horse cow) # Выводим содержимое массива: echo ${arrAnimals[@]} # В конец массива arrAnimals добавляем новый элемент: "pig" arrAnimals+=(pig) # И снова показываем содержимое массива: echo ${arrAnimals[@]}
Ассоциативные массивы
Начиная с версии 4.0 в Bash появилась поддержка ассоциативных массивов (так называемых hash-массивов).
Для объявления ассоциативных массивов используется ключ -A встроенной команды declare:
declare -A hshArray
Как и в случае с индексированными массивами, для заполнения ассоциативных массивов могут использоваться два различных синтаксиса:
1)
TheCapitalOf[Georgia]='Tbilisi' TheCapitalOf[Australia]='Canberra' TheCapitalOf[Pakistan]='Islamabad'
2)
TheCapitalOf=([Georgia]='Tbilisi' [Australia]='Canberra' [Pakistan]='Islamabad')
С помощью ассоциативных массивов можно имитировать поддержку многомерных массивов:declare -A a # объявляет ассоциативный массив 'a' i=1; j=2 # инициализация нескольких индексов a[$i,$j]=5 # присвоение значения "5" в ячейку "$i,$j" (т.е. "1,2") echo ${a[$i,$j]} # вывод хранимых значений из "$i,$j"
Конвейер
Конвейер передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора. Метод часто используется для связывания последовательности команд в единую цепочку. Конвейер обозначается следующим символом:
|
.Пример (grep работает как фильтр для стандартного вывода):
cat filename | grep something
Логические переменные
||
логическая операцияOR
(логическое ИЛИ). В операциях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).&&
логическая операцияAND
(логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).Целочисленная математика
Главное ограничение Bourne shell это то, что он не может выполнять вычисления с целыми числами без создания внешнего процесса. Bash может выполнять целочисленные вычисления внутри процесса используя команду
((…))
и синтаксис переменной$[…]
, как показано ниже:VAR=55 # Устанавливаем переменную VAR, равной 55 ((VAR = VAR + 1)) # Добавляем единицу к переменной VAR. Обратите внимание на отсутствие знака '$' ((++VAR)) # Другой способ увеличения VAR на единицу. Выполняет префиксный инкремент ((VAR++)) # Другой способ увеличения VAR на единицу. Выполняет постфиксный инкремент echo $[VAR * 22] # Умножаем VAR на 22 и передаем результат команде echo $((VAR * 22)) # Другой способ сделать то же
Команда
((…))
так же может использоваться в условных утверждениях, так как её исходный параметр это 0 или 1, которые могут интерпретироваться как true или false:if ((VAR == Y * 3 + X * 2)) then echo Yes fi ((Z > 23)) && echo Yes
Команда
((…))
поддерживает следующие относительные операторы:==
!=
>
<
>=
<=
.Bash не поддерживает вычисления внутри процесса с числами с плавающей точкой. Только командные процессоры Unix Korn-shell (версия 1993 года) и zsh (начиная с версии 4.0) поддерживают эту возможность.
Список математических операций:
+
,-
,*
,/
,**
(возведение в степень),%
(деление по модулю, остаток от деления),let
— позволяет использовать сокращения арифметических команд (сокращая количество используемых переменных; например:a += b
эквивалентноa = a+b
и т. п.).Переменные и аргументы
Аргументы:
$$
pid текущего shell (самого процесса-сценария) $!
pid последнего процесса в фоновом режиме $?
код возврата последнего процесса (функции или скрипта) $x
где x — номер параметра, переданного скрипту ( $1
,$2
и т. д.,$0
— последний запущенный скрипт)$#
количество аргументов командной строки $*
все аргументы в виде одной строки (слова) $@
то же самое, что и $*
, но при этом каждый параметр представлен как отдельная строка (слово)$-
список флагов, переданных сценарию $_
содержит последний аргумент предыдущей команды Встроенные переменные:
$BASH
путь к исполняемому файлу bash $BASH_VERSINFO[n]
массив, состоящий из 6 элементов, содержащий информацию о версии bash $BASH_VERSION
версия Bash, установленного в системе $DIRSTACK
содержимое вершины стека каталогов $EDITOR
заданный по умолчанию редактор $EUID
«эффективный» идентификационный номер пользователя (Effective User ID) $FUNCNAME
имя текущей функции $GLOBIGNORE
перечень шаблонных символов, которые будут проигнорированы при выполнении подстановки имен файлов (globbing) $GROUPS
группы, к которым принадлежит текущий пользователь $HOME
домашний каталог пользователя $HOSTNAME
сетевое имя хоста $HOSTTYPE
тип машины (идентифицирует аппаратную архитектуру) $IFS
разделитель полей во вводимой строке $LC_COLLATE
задает порядок сортировки символов, в операциях подстановки имен файлов и в поиске по шаблону $LC_CTYPE
определяет кодировку символов $LINENO
Номер строки исполняемого сценария $MACHTYPE
аппаратная архитектура $OLDPWD
прежний рабочий каталог $OSTYPE
тип операционной системы $PATH
путь поиска (включает в себя каталоги /usr/bin/, /usr/X11R6/bin/, /usr/local/bin и т. д.) $PIPESTATUS
Код возврата канала (конвейера) $PPID
PID (идентификатор) родительского процесса $PS1
приглашение командной строки $PS2
вторичное приглашение командной строки, выводится тогда, когда от пользователя ожидается дополнительный ввод. Отображается как «>» $PS3
третичное приглашение, выводится, когда пользователь должен сделать выбор в операторе select
$PS4
приглашение четвёртого уровня, выводится в начале каждой строки вывода тогда, когда сценарий вызывается с ключом -x
. Отображается как «+»$PWD
рабочий (текущий) каталог $REPLY
переменная по умолчанию, куда записывается ввод пользователя, выполненный с помощью команды read
$SECONDS
время работы сценария (в секундах) $SHELLOPTS
список допустимых опций интерпретатора (доступна только для чтения) $SHLVL
уровень вложенности shell Регулярные выражения внутри процесса
Bash 3.0 поддерживает встроенные регулярные выражения, с синтаксисом подобным синтаксису Perl:
[[string =~ regex]]
Синтаксис регулярных выражений задокументирован на страницах документации man 7 regex. Статус выхода устанавливается в 0, если регулярное выражение совпало со строкой, и 1, если нет. Значение подвыражения, заключённого в скобки, можно получить через переменную ${BASH_REMATCH[@]}, например:
REGEXP='foo(bar)bl(.*)' if [["abcfoobarbletch" =~ $REGEXP]] then echo "Регулярное выражение совпало со строкой!" echo "$BASH_REMATCH" # выводит: foobarbletch echo "${BASH_REMATCH [1]}" # выводит: bar echo "${BASH_REMATCH [2]}" # выводит: etch fi
Встроенные регулярные выражения работают быстрее, чем выполнение внешней команды grep, потому что соответствующее регулярное выражение выполняется в рамках процесса Bash. Если регулярное выражение или строка содержат пробелы или метасимволы (такие как * или ?), их следует взять в кавычки. Рекомендуется использовать переменную для хранения регулярного выражения, как в вышеприведенном примере, для избежания проблем с экранированием специальных символов. Можно использовать вывод bash с опцией
-x
для проверки, как именно bash воспринимает ваше регулярное выражение.Расширение скобок
Возможность расширения скобок заимствована у csh. Она позволяет произвольной строке быть сформированной с использованием похожей техники, как это делается с названиями файлов. Однако в bash сгенерированные строки не обязаны быть именами файлов. Результат каждого расширения строки не сортируется, сохраняется порядок слева направо:
# Это особенность присущая bash echo a{p,c,d,b}e # ape ace ade abe
Не следует использовать эту особенность, если скрипт планируется портировать, потому что в традиционных скриптах расширение строки не будет действовать:
# Традиционная оболочка не дает тот же результат echo a{p,c,d,b}e # a{p,c,d,b}e
Когда используется расширение скобок в сочетании с символами подстановки, скобки раскрываются первыми, а затем результат обрабатывается в обычном режиме. Таким образом, список JPEG и PNG изображений в текущем каталоге может быть получен так:
ls *.{jpg,jpeg,png} # скобки раскрываются до *.jpg *.jpeg *.png - после чего выполняется регулярное выражение
Горячие клавиши
- Tab ⇆ : Автодополнение строки за курсором.
- Ctrl + a : Перемещает курсор в начало строки (эквивалентно клавише Home ).
- Ctrl + b : Перемещает курсор на один символ назад.
- Ctrl + c : Посылает сигнал SIGINT текущему заданию, который обычно (но не всегда) прекращает и закрывает его.
- Ctrl + d : Посылает маркер EOF, который (если не отключено опцией и текущая строка не содержит текста) закрывает текущую оболочку (эквивалентно команде exit).
- Ctrl + d : Удаляет текущий символ (Только если есть текст на текущей строке).
- Ctrl + e : Перемещает курсор в конец строки (эквивалентно клавише End ).
- Ctrl + f : Перемещает курсор на один символ вперёд.
- Ctrl + h : Удаляет предыдущий символ (то же самое, что и клавиша ← Backspace ).
- Ctrl + i Эквивалентно клавише Tab.
- Ctrl + j Эквивалентно клавише Enter.
- Ctrl + k Очищает содержимое строки после курсора и копирует это в буфер обмена.
- Ctrl + l Очищает содержимое экрана (эквивалентно команде clear).
- Ctrl + n (следующее) вызывает следующую команду (эквивалентно клавише ↓ ).
- Ctrl + o Выполняет найденную команду в истории, и выбирает следующую строку относительно текущей строки в истории для того, чтобы отредактировать.
- Ctrl + p (предыдущее) вызывает предшествующую команду (эквивалентно клавише ↑ ).
- Ctrl + u : Очищает содержание строки до курсора и копирует его в буфер обмена.
- Ctrl + w : Убирает слово до курсора и копирует его в буфер обмена.
- Ctrl + y : добавляет содержимое буфера обмена от позиции курсора.
- Ctrl + z : Посылает сигнал SIGTSTP текущему заданию, который приостанавливает его выполнение. Для возобновления его выполнения в фоновом режиме можно ввести команду bg. Для того, чтобы вернуть его из фонового режима или приостановки можно выполнить fg.
- Alt + b : (назад) перемещает курсор назад на одно слово.
- Alt + d : Сокращает слово после курсора.
- Alt + f : (вперед) перемещает курсор вперёд на одно слово.
- Ctrl + x Ctrl + e : Редактирует текущую строку в программе $EDITOR, или vi если не предопределено.
- Ctrl + x Ctrl + v Вывод на экран информации о версии текущего экземпляра bash.
Стартовые скрипты
Bash при запуске вызывает команды из множества различных скриптов.
Когда Bash вызывается как интерактивная оболочка входа в систему, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в следующем порядке: ~/.bash_profile, ~/.bash_login и ~/.profile, читает и вызывает команды из первого, который существует и доступен для чтения. При выходе bash читает и выполняет команды из файла ~/.bash_logout.
Когда запускается интерактивная оболочка, но не для входа в систему, bash читает и исполняет команды из файлов /etc/bash.bashrc и ~/.bashrc, если они существуют. Это может быть отменено опцией
-norc
. Опция-rcfile file
заставит Bash использовать команды из файла file вместо /etc/bash.bashrc и ~/.bashrc.Переносимость
Скрипты оболочек, написанные со специфическими для bash особенностями (bashism-ы) не будут работать на системах, где используется Bourne shell или один из его заменителей, без того, чтобы bash был установлен как дополнительная оболочка, и, конечно, скрипты надо начинать с
#!/bin/bash
. Эта проблема стала особенно важной, когда Ubuntu начал с октября 2006 года поставлять Debian Almquist shell (dash) как скриптовую оболочку по умолчанию, что привело к неработоспособности многочисленных скриптов.См. также
Примечания
Ссылки
- Bash Reference Manual (англ.). — Официальное руководство. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Bash Reference Manual. — Перевод man-страницы от 2004 года. Архивировано из первоисточника 18 мая 2012.
- Advanced Bash-Scripting Guide (рус.). — Расширенное руководство по написанию bash-скриптов. Архивировано из первоисточника 23 августа 2011. Проверено 6 августа 2011.
- Частые ошибки программирования на Bash. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Введение в программирование на bash. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Bash (рус.). openSuse wiki. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Описание команд bash (англ.). Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Ян Шилдс (Ian Shields) Полезные советы Linux: Параметры bash и расширения параметров (рус.). Архивировано из первоисточника 15 октября 2012.
Команды Unix POSIX.1-2008 Утилиты POSIX.1-2008 admin • alias • ar • asa • at • awk • basename • batch • bc • bg • c99 • cal • cat • cd • cflow • chgrp • chmod • chown • cksum • cmp • comm • command • compress • cp • crontab • csplit • ctags • cut • cxref • date • dd • delta • df • diff • dirname • du • echo • ed • env • ex • expand • expr • false • fc • fg • file • find • fold • fort77 • fuser • gencat • get • getconf • getopts • grep • hash • head • iconv • id • ipcrm • ipcs • jobs • join • kill • lex • link • ln • locale • localedef • logger • logname • lp • ls • m4 • mailx • make • man • mesg • mkdir • mkfifo • more • mv • newgrp • nice • nl • nm • nohup • od • paste • patch • pathchk • pax • pr • printf • prs • ps • pwd • qalter • qdel • qhold • qmove • qmsg • qrerun • qrls • qselect • qsig • qstat • qsub • read • renice • rm • rmdel • rmdir • sact • sccs • sed • sh • sleep • sort • split • strings • strip • stty • tabs • tail • talk • tee • test • time • touch • tput • tr • true • tsort • tty • type • ulimit • umask • unalias • uname • uncompress • unexpand • unget • uniq • unlink • uucp • uudecode • uuencode • uustat • uux • val • vi • wait • wc • what • who • write • xargs • yacc • zcat GNU Coreutils Файловые утилиты chgrp • chown • chmod • cp • dd • df • dir • dircolors • install • ln • ls • mkdir • mkfifo • mknod • mv • rm • rmdir • shred • sync • touch • vdir Текстовые утилиты cat • cksum • comm • csplit • cut • expand • fmt • fold • head • join • md5sum • nl • od • paste • ptx • pr • sha1sum • sort • split • sum • tac • tail • tr • tsort • unexpand • uniq • wc Shell-утилиты basename • chroot • date • dirname • du • echo • env • expr • factor • false • groups • hostid • id • link • logname • nice • nohup • pathchk • pinky • printenv • printf • pwd • readlink • seq • sleep • stat • stty • tee • test • true • tty • uname • unlink • users • who • whoami • yes Интерфейс пользователя в UNIX-подобных системах Среды рабочего стола Менеджеры окон Командные оболочки X Window System Проект GNU История Лицензии GNU GPL • GNU LGPL • Affero GPL • GNU FDL • GPL linking exception
Программное
обеспечениеПерсоналии Александре Олива • Бенджамин Хилл • Брэдли Кун • Эбен Моглен • Федерико Хейнц • Джордж Грив • Георг Греве • Джошуа Гэй • Лоис Дечэри • Мэтт Ли • Рикардо Галли • Ричард Столлман • Роберт Часселл • Вильям Джон Салливан
Другие темы Категории:- Программное обеспечение по алфавиту
- Командные оболочки UNIX
- GNU
- Скриптовые языки
Wikimedia Foundation. 2010.