bash
Типичная сессия в bash |
|
| Тип |
командная оболочка UNIX |
|---|---|
| Автор |
Брайан Фокс (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, но с рядом расширений.
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, как скриптовую оболочку по умолчанию, что привело к недееспособности многочисленных скриптов.
[править] Ссылки
- Bash Reference Manual (англ.). в Официальное руководство. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Bash Reference Manual (рус.). в перевод мана 2004 года. Архивировано из первоисточника 18 мая 2012.
- Advanced Bash-Scripting Guide (рус.). в Продвинутое руководство по bash-скриптингу. Архивировано из первоисточника 23 августа 2011. Проверено 6 августа 2011.
- Частые ошибки программирования на Bash (рус.). Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Введение в программирование на bash (рус.). Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Bash (рус.). openSuse enci. Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
- Описание команд bash (англ.). Архивировано из первоисточника 23 августа 2011. Проверено 22 ноября 2010.
[править] См. также
- Сравнение командных оболочек
- Командная оболочка UNIX
- Оболочка операционной системы
- Операционная система
- Пакетный файл
- Bourne shell
- GNU readline в библиотека, позволяющая выполнять редактирование в командной строке
| Это заготовка статьи о свободном программном обеспечении. Вы можете помочь проекту, исправив и дополнив её. |
| Командные оболочки UNIX | |
|---|---|
| Bash · Bourne · Almquist · csh · dash · fish · Hamilton · Korn · PWB · psh · Rc · sash · tcsh · Thompson · Wish · zsh |
| Стандартные программы UNIX (все программы) | |
|---|---|
| Файловые системы | chroot dd df fdisk fsck mkisofs mkswap mount umount rehash |
| Файлы и каталоги | cat chattr cd chmod chown chgrp cksum cmp cp diff du file fuser ln ls lsof mkdir mv od pwd rm rmdir split touch |
| Процессы | at cron exit kill killall nice nohup pgrep pidof pkill ps renice sleep time top wait watch |
| Пользователи | env finger id last logname mesg passwd su sudo uptime w wall who whoami write |
| Сеть | ftp host ifconfig netcat netstat nmap nslookup ping rlogin SSH traceroute wget |
| Тексты | AWK comm cut ed ex expand unexpand fmt head iconv join less more paste pr sed sort tac tail tr uniq wc xargs |
| Командная строка | alias basename bash bind dirname echo expr false printf test true unset |
| Поиск | find grep strings whereis which |
| Разное | banner bc cal date help lp man history size tee uname yes reboot |
| Интерфейс пользователя в UNIX-подобных системах | |
|---|---|
| Среды рабочего стола | |
| Менеджеры окон | |
| Командные оболочки | |
| Проект GNU | ||
|---|---|---|
| История | ||
| Лицензии | ||
| Программное обеспечение |
||
| Персоналии | ||
| Другие темы | ||