17-04-2023
Типичная сессия в bash |
|
Тип | |
---|---|
Автор |
Брайан Фокс (Brian Fox) |
Разработчик |
Чет Рамей (Chet Ramey) |
Написана на | |
Операционная система | |
Языки интерфейса |
Английский, мультиязычный (gettext) |
Последняя версия |
4.2 (13 февраля 2011 года) |
Лицензия | |
Сайт |
gnu.org/software/bash |
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]
#!/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).
Для операций с этими дескрипторами, существуют специальные символы: >
(перенаправление вывода), <
(перенаправление ввода). Символ &
означает указатель на дескриптор 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 rm $i i=$[$i+1] done
Bash имеет поддержку одномерных массивов. Инициализировать элементы массива можно в виде: my_array[xx]
. Также можно явно объявить массив в сценарии, с помощью директивы declare
:
declare -a my_array
Обращаться к отдельным элементам массива можно с помощью фигурных скобок, то есть: ${my_array[xx]}
.
Bash 4.0 поддерживает ассоциативные массивы, тем самым имея фальшивую поддержку многомерных массивов:
declare -a a # объявляет ассоциативный массив 'a' i=1; j=2 # инициализация нескольких индексов a[$i,$j]=5 # присвоение значения "5" в ячейку "$i,$j" (т.е. "1,2") echo ${a[$i,$j]} # вывод хранимых значений из "$i,$j"
Инициализировать массив можно и иными способами:
Array=(element1 element2 element3)
temp_array[0]=element1 temp_array[5]=element temp_array[9]=elementN
Конвейер передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора. Метод часто используется для связывания последовательности команд в единую цепочку. Конвейер обозначается следующим символом: |
.
Пример (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 - после чего выполняется регулярное выражение
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) как скриптовую оболочку по умолчанию, что привело к недееспособности многочисленных скриптов.
Это заготовка статьи о свободном программном обеспечении. Вы можете помочь проекту, исправив и дополнив её. |
Интерфейс пользователя в UNIX-подобных системах | |
---|---|
Среды рабочего стола | |
Менеджеры окон | |
Командные оболочки | |
X Window System |
Проект GNU | ||
---|---|---|
История | ||
Лицензии | ||
Программное обеспечение |
||
Персоналии | ||
Другие темы |
Bash.