статьиGNU Free Documentation License материалы взяты из Википедии Статья была изменена. Оригинал статьи.

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

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

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

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

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

[править] «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 в Стандартный вывод ошибок.

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

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

#!/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) поддерживают эту возможность.

[править] 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 [[ "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, как скриптовую оболочку по умолчанию, что привело к недееспособности многочисленных скриптов.

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

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


Источник в «/w/index.php?title=Bash&oldid=44887824»
Пространства имён

Варианты
Просмотры
Действия