bash

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
GNU Bourne-Again SHell
Типичная сессия в bash
Типичная сессия в bash
Тип

командная оболочка UNIX

Автор

Брайан Фокс (Brian Fox)

Разработчик

Чет Рамей (Chet Ramey)

Написана на

Си

Операционная система

UNIX-подобные

Язык интерфейса

Английский, мультиязычный (gettext)

Последняя версия

4.2 (13 февраля 2011 года)

Лицензия

GNU General Public License

Сайт

http://www.gnu.org/software/bash/

bash (от англ. Bourne again shell, каламбур «Born again» shell — «Возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.

Bash это командный процессор, который, как правило, работает в текстовом окне, что позволяет пользователю вводить команды вызывающие определенные действия. Bash также может читать команды из файла, который называется скриптом. Как и все Unix-оболочки, он поддерживает автодополнение регулярных выражений, названий файлов и папок, подстановку вывода результата команд, переменные, контроль за порядком выполнения, и операторы ветвления и итерации. Ключевые слова, синтаксис и другие основные особенности языка были скопированы с sh. Другие функции, например, история, были скопированы с csh и ksh. Bash является оболочкой POSIX, но с рядом расширений.

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, и синтаксис замены команды POSIX: $(...). Когда 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

[править] Скрипты

В простейшем случае, скрипт — простой список команд, записанный в файл. Командный процессор должен знать, что он должен этот файл обработать, а не просто прочесть его содержимое. Для этого служит специальная конструкция, называемая «sha-bang»: #!. Символ # задает комментарий, но в данном случает sha-bang означает, что после этого спецсимвола находится путь к обработчику скрипта (явно указывает системе какой интерпретатор используется для исполнения сценария)

[править] Синтаксис

Синтаксис команд bash - это расширенный синтаксис команд Bourne shell. Окончательная спецификация синтаксиса команд Bash есть в Bash Reference Manual, распространяемый проектом GNU.

[править] «Hello world»

 
 #!/bin/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 — Стандартный вывод ошибок.

Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), < (перенаправление ввода). Cимвол & означает указатель на дескриптор 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

Bash, начиная с версии 2.05b, может перенаправлять стандартный ввод из строки, используя следующий синтаксис (который иногда называют « 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")

[править] Условный оператор

 
 #!/bin/bash 
 T1="foo" 
 T2="bar" 
 if [ "$T1" = "$T2" ]; then 
   echo условие выполняется 
 else 
   echo условие не выполняется 
 fi

[править] Циклы

 
 #!/bin/bash 
 for i in `seq 1 10`; 
 do 
   echo $i 
 done
 
 #!/bin/bash 
 COUNTER=0 
 while [  $COUNTER -lt 10 ]; do 
   echo The counter is $COUNTER 
   let COUNTER=COUNTER+1 
 done
 
 #!/bin/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).

[править] Cписок математических операций

+ — сложение
— вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль(деление по модулю), остаток от деления
let — позволяет использовать сокращения арифметических команд (сокращая количество используемых переменных). Например: a = a+b эквивалентно 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 cетевое имя хоста
$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 &#91;[ "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, как скриптовую оболочку по умолчанию, что привело к недееспособности многочисленных скриптов.

[править] Ссылки

[править] См. также

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Участие
Печать/экспорт
Инструменты
На других языках