Bash

Bash (от англ. Bourne again shell, каламбур «Born again» shell — «возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки. Представляет собой командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне. Bash также может читать команды из файла, который называется скриптом (или сценарием). Как и все Unix-оболочки, он поддерживает автодополнение имён файлов и каталогов, подстановку вывода результата команд, переменные, контроль над порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh. Другие функции, например, история, были скопированы из csh и ksh. Bash в основном соответствует стандарту POSIX, но с рядом расширений. Название «bash» является акронимом от англ. Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка. В сентябре 2014 года в bash была обнаружена широко эксплуатируемая уязвимость Bashdoor.
| GNU Bourne-Again SHell | |||
|---|---|---|---|
| | |||
| Типичный сеанс в bash | |||
| Тип | Оболочка операционной системы, командная оболочка UNIX | ||
| Автор | Брайан Фокс | ||
| Разработчик | Чет Рэйми | ||
| Написана на | Си | ||
| Операционные системы | |||
| Языки интерфейса | Многоязычный (gettext) | ||
| Дата выпуска | 8 июня 1989 | ||
| Аппаратная платформа | GNU | ||
| Последняя версия | |||
| Тестовая версия | 5.2-beta (13 апреля 2022 года) | ||
| Репозиторий | git.savannah.gnu.org/cgi… | ||
| |||
| Лицензия | |||
| Сайт | gnu.org/software/bash/ | ||
Bash (от англ. Bourne again shell, каламбур «Born again» shell — «возрождённый» shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.
Представляет собой командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне. Bash также может читать команды из файла, который называется скриптом (или сценарием). Как и все Unix-оболочки, он поддерживает автодополнение имён файлов и каталогов, подстановку вывода результата команд, переменные, контроль над порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh. Другие функции, например, история, были скопированы из csh и ksh. Bash в основном соответствует стандарту POSIX, но с рядом расширений[7].
Название «bash» является акронимом от англ. Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.
В сентябре 2014 года в bash была обнаружена широко эксплуатируемая уязвимость Bashdoor.
История
[править | править код]Функциональность сценариев оболочки изначально появилась в файлах, называемых «runcom» в честь появившегося в 1963 году макропроцессора с тем же названием. Суффикс «rc» — это сокращение от «runcom».[8] Термин «оболочка» был придуман Луи Пузеном в 1964 или 1965 году и появился в его статье 1965 года «Оболочка, глобальный инструмент для вызова и цепочки процедур в системе», в которой описываются многие функции, позже обнаруженные во многих оболочках Unix.[9][10] Стандарт ASCII для кодировки символов был определен в 1969 году в документе под названием RFC 20.[11]
Хронология
[править | править код]Ниже перечислены значимые события в истории Bash :
| Дата | Событие |
|---|---|
| 10 января 1988 |
Брайан Фокс начал разрабатывать Bash после того, как Ричард Столлман был недоволен отсутствием прогресса, достигнутого предыдущим разработчиком.[12] Столлман и FSF считали, что свободная оболочка, способная запускать существующие сценарии оболочки, настолько важна для полностью свободной системы, построенной на коде BSD и GNU, что это был один из немногих проектов, которые они финансировали сами. Fox выполнял эту работу в качестве сотрудника FSF.[12][13] |
| 8 июня 1989 |
Фокс выпустил Bash как бета-версию 0.99.[14] Лицензия — GPL 1.0+. «Помимо поддержки обратной совместимости для сценариев, Bash включил в себя функции оболочек Korn и C. Вы найдете историю команд, редактирование командной строки, стек каталогов (pushd и popd), множество полезных переменных окружения, автодополнение команд и многое другое.»[15] В конечном итоге, он стал поддерживать «регулярные выражения (аналогично Perl) и ассоциативные массивы». |
| 1991 |
Bash имеет историческое значение как одна из первых программ, портированных на Линусом Торвальдсом, наряду с GNU Compiler (GCC).[16] |
| 1992 ~ 1994 |
Брайан Фокс ушел с поста основного сопровождающего где-то между серединой 1992 года[17] и серединой 1994 года.[18][19] Его обязанности были переданы другому раннему участнику, Чету Рэйми.[20][21][22][23] С тех пор Bash стал самой популярной интерактивной оболочкой по умолчанию среди основных дистрибутивов GNU/Linux, таких как Fedora, Debian и openSUSE, а также среди их производных и конкурентов.[24][25] |
| 26 января 1994 |
Debian — первый релиз. Bash является оболочкой по умолчанию для интерактивного и неинтерактивного взаимодействия.[26] |
| 31 декабря 1996 |
Чет Рэйми выпустил bash 2.0. Лицензия — GPL 2.0+. |
| 5 июня 1997 |
Вышел Bash 2.01. |
| 18 апреля 1998 |
Вышел Bash 2.02. |
| 19 февраля 1999 |
Вышел Bash 2.03. |
| 21 марта 2000 |
Вышел Bash 2.04. |
| 14 сентября 2000 |
Список рассылки Bug-bash существует.[27] |
| 9 апреля 2001 |
Вышел Bash 2.05.[28] |
| 2003 |
Начиная с OS X 10.3 Panther, Bash стал оболочкой по умолчанию в операционных системах Apple (то есть macOS).[29][30] Он также был доступен в OS X 10.2 Jaguar, где оболочкой по умолчанию был tcsh. |
| 27 июля 2004 |
Вышел Bash 3.0.[31] |
| 9 декабря 2005 |
Вышел Bash 3.1.[32] |
| 12 октября 2006 |
Вышел Bash 3.2.[33] Лицензия — GPL 2.0+. |
| 2006 |
В Ubuntu в качестве оболочки по умолчанию вместо bash используется dash. |
| 20 февраля 2009 |
Вышел Bash 4.0[34] Лицензия — GPL 3.0+. |
| 2 января 2010 |
Вышел Bash 4.1.[35] |
| 14 февраля 2011 |
Вышел Bash 4.2.[36] |
| 2012 |
В Solaris 11, «оболочкой пользователя по умолчанию является Bourne-again (bash) shell.»[37] |
| 27 февраля 2014 |
Вышел Bash 4.3.[38] |
| 8 сентября 2014 |
Bashdoor (Shellshock).[39][40] Патчи для исправления ошибок были выпущены вскоре после того, как ошибки были обнаружены.[41] |
| 2015 |
Termux и другие приложения для эмуляции терминала обеспечивают доступность Bash на Android. |
| 15 сентября 2016 |
Вышел Bash 4.4. |
| 2009 ~ 2018 |
Apple отказывается принять четвёртую версию Bash, распространяемую под третьей версией лицензии GNU GPL, и перестаёт поставлять обновления для Bash после версии 3.2 (поставляемой в MacOS Mojave). |
| 5 июня 2019 |
Apple объявляет zsh своей оболочкой по умолчанию[42] и поставляет версию 5.7 в своей MacOS Catalina.[43][44][45] |
| 7 января 2019 |
Вышел Bash 5.0.[46] |
| 7 декабря 2020 |
Вышел Bash 5.1.[47] |
| 26 сентября 2022 |
Вышел Bash 5.2. |
| 2025 |
Вышел Bash 5.3. |
Различия в синтаксисе
[править | править код]Подавляющее большинство важных скриптов командного процессора Bourne может выполняться без изменения в bash, за исключением тех, которые ссылаются на специальные переменные Bourne или используют встроенные команды Bourne. Синтаксис команд Bash включает идеи, заимствованные у Korn shell (ksh) и C shell (csh), такие как редактирование командной строки, история команд, стек каталогов, переменные $RANDOM и $PPID, синтаксис замены команды $(…). Когда Bash используется как интерактивный командный процессор, он поддерживает автозавершение имён программ, файлов, переменных и т. п. с помощью клавиши Tab ↹.
Внутренние команды
[править | править код]Интерпретатор bash имеет множество встроенных команд, часть из которых имеет аналогичные исполняемые файлы в операционной системе. Однако следует обратить внимание, что чаще всего для встроенных команд отсутствуют man-страницы, а при попытке просмотра справки по встроенной команде на самом деле будет выдаваться справка по исполняемому файлу. Исполняемый файл и встроенная команда могут различаться параметрами. Информация по встроенным командам расписана в справочной странице bash:
man bash
| Ввод-вывод | |
|---|---|
echo |
выводит выражение или содержимое переменной (stdout), но имеет ограничения в использовании[48] |
printf |
команда форматированного вывода, расширенный вариант команды echo
|
read |
«читает» значение переменной со стандартного ввода (stdin), в интерактивном режиме это клавиатура |
| Файловая система | |
cd |
изменяет текущий каталог |
pwd |
выводит название текущего рабочего каталога (от англ. print working directory) |
pushd |
изменяет текущий каталог с возможностью возврата в обратном порядке |
popd |
возвращает текущий каталог после pushd
|
dirs |
выводит или очищает содержимое стека каталогов, сохранённых через pushd
|
| Действия над переменными | |
let |
производит арифметические операции над переменными |
eval |
транслирует список аргументов из списка в команды |
set |
изменяет значения внутренних переменных скрипта |
unset |
удаляет переменную |
export |
экспортирует переменную, делая её доступной дочерним процессам |
declare, typeset |
задают и/или накладывают ограничения на переменные |
getopts |
используется для разбора аргументов, передаваемых скрипту из командной строки |
| Управление сценарием | |
source, . (точка) |
запуск указанного сценария |
exit |
безусловное завершение работы сценария |
exec |
заменяет текущий процесс новым, запускаемым командой exec
|
shopt |
позволяет изменять ключи (опции) оболочки «на лету» |
| Команды | |
true |
возвращает код завершения ноль (успешное завершение) |
false |
возвращает код завершения, который свидетельствует о неудаче |
type prog |
выводит полный путь к prog |
hash prog |
запоминает путь к prog |
help COMMAND |
выводит краткую справку по использованию внутренней команды COMMAND |
| Управление запущенными в командной оболочке задачами | |
jobs |
показывает список запущенных в командной оболочке задач либо информацию о конкретной задаче по её номеру |
fg |
переключает поток ввода на текущую задачу (или на определённую задачу, если указан её номер) и продолжает её исполнение |
bg |
продолжает исполнение текущей приостановленной задачи (или определённых задач, если указаны их номера) в фоновом режиме |
wait |
ожидает завершения указанных задач |
Скрипты
[править | править код]В простейшем случае скрипт — простой список команд, записанный в файл. Командный процессор должен знать, что он должен этот файл обработать, а не просто прочесть его содержимое. Для этого служит специальная конструкция, называемая shebang: #!. Символ # задаёт комментарий, но в данном случае shebang означает, что после этого спецсимвола находится путь к интерпретатору для исполнения сценария.
Синтаксис
[править | править код]Синтаксис команд bash — это расширенный синтаксис команд Bourne shell. Окончательная спецификация синтаксиса команд bash есть в Bash Reference Manual, распространяемом проектом GNU.[49]
«Hello world»
[править | править код]#!/usr/bin/env bash
echo 'Hello World!'
Этот скрипт содержит только две строки. Первая строка сообщает системе о том, какая программа используется для запуска файла. Вторая строка — это единственное действие, которое выполняется этим скриптом, он собственно печатает «Hello world!» в терминале.
Запуск скрипта
[править | править код]Для того, чтобы скрипт стал исполняемым, могут быть использованы следующие команды:
chmod +rx scriptname # выдача прав на чтение/исполнение любому пользователю
chmod u+rx scriptname # выдача прав на чтение/исполнение только «владельцу» скрипта
Из соображений безопасности путь к текущему каталогу . не включён в переменную окружения $PATH. Поэтому для запуска скрипта необходимо явно указывать путь к текущему каталогу, в котором находится скрипт:
./scriptname
Кроме того, передать такой файл на исполнение интерпретатору Bash можно и явно, используя команду bash:
bash scriptname
В этом случае не требуется ни установка прав доступа, ни использование последовательности #! в коде.
Перенаправление ввода-вывода
[править | править код]В bash есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr).
- stdin — стандартный ввод — то, что набирает пользователь в консоли;
- stdout — стандартный вывод программы;
- stderr — стандартный вывод ошибок.
Для операций с этими и пользовательскими дескрипторами существуют специальные символы: > (перенаправление вывода), < (перенаправление ввода). Символы &, - могут предварять номер дескриптора; например, 2>&1 — перенаправление дескриптора 2 (stderr) в дескриптор 1 (stdout).
0<filename или <filename |
Перенаправление ввода из файла filename
|
1>filename или >filename |
Перенаправление вывода в файл «filename». Если отключена опция noclobber, то файл перезаписывается поступающими данными
|
1>|filename или >|filename |
Перенаправление вывода в файл «filename», файл перезаписывается поступающими данными |
1>>filename или >>filename |
Перенаправление вывода в файл «filename», данные добавляются в конец файла. При отсутствии файла он создаётся |
2>filename |
Перенаправление стандартного вывода ошибок в файл «filename» |
2>>filename |
Перенаправление стандартного вывода ошибок в файл «filename», данные добавляются в конец файла. При отсутствии файла он создаётся |
&>filename |
Перенаправление вывода и ошибок в файл «filename» |
2>&1 |
Перенаправление вывода ошибок на стандартный вывод |
Bash имеет индивидуальный синтаксис перенаправления, который не поддерживается в Bourne shell. Пример одновременного перенаправления стандартного вывода и стандартных ошибок:
command &> file
Это проще набрать, чем эквивалентную команду в синтаксисе Bourne shell
command > file 2>&1
Перенаправление «из кода скрипта»
[править | править код]Поддерживается heredoc-синтаксис:
- С интерпретацией переменных и конструкций языка внутри блока:
$a='многострочный'
command <<MYDOC123
$a
текст
$(<$HOME/my_file.txt)
MYDOC123
- Без интерпретации переменных:
command <<'PERLCODE'
my $first='Hello';
my $second='world';
say join(', ',$first,$second),'!';
PERLCODE
- С удалением начальных отступов (поддерживаются только отступы табуляцией):
command <<-'TABSTRIP'
for ((i=0; i<10; i++))
do
echo "$i"
done
TABSTRIP
Начиная с версии 2.05b, bash может перенаправлять стандартный ввод из строки, используя следующий синтаксис «here strings»:
command <<< "string to be read as standard input"
Если строка содержит пробелы, её следует заключить в кавычки или апострофы, либо экранировать пробелы обратной косой чертой.
Будьте внимательны: вводимая с использованием here strings строка содержит неявную последовательность завершения строки: либо 1 дополнительный байт line feed, либо 2 дополнительных байта: carriage return и line feed.
cat -<<<'123' | wc -c
# Результат: 4
cat <(echo -n '123') | wc -c
# Результат: 3
wc -c <<<'123'
# Результат: 4
echo -n 123 | wc -c
# Результат: 3
Начиная с версии 4.1[50] стало возможным указывать в одной строке терминирующую последовательность символов и, сразу за ней, — скобку. Это может быть полезно для присвоения переменной содержимого here-doc:
var=$( cat -<<'TERMSEQ'
Февраль. Достать чернил и плакать!
Писать о феврале навзрыд,
Пока грохочущая слякоть
Весною чёрною горит.
TERMSEQ)
При этом BASH будет сгенерировано предупреждающее сообщение.
Перенаправление для процесса в целом
[править | править код]Пример (перенаправление стандартного вывода в файл, запись данных, закрытие файла, сброс 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<&-
Подстановка вывода команд
[править | править код]Захват вывода внешних команд:
# выполнить 'date' и поместить результат в VAR
VAR="$(date)"
echo "$VAR" #выведет дату на момент вызова предыдущей строки
При этом не поддерживаются строки с нуль-символом, заключительные переводы строк пропадают, в отличие от каналов и прочего файлового ввода-вывода.
Условный оператор
[править | править код]#!/usr/bin/env bash
T1='foo'
T2='bar'
if [[ $T1 == "$T2" ]]
then
echo 'условие выполняется'
else
echo 'условие не выполняется'
fi
Обратите внимание, что кавычки вокруг левой части необязательны.[51]
Циклы
[править | править код]#!/usr/bin/env bash
for i in "Номер "{1..10}
do
echo "$i"
done
#!/usr/bin/env bash
COUNTER=0
while [[ $COUNTER -lt 10 ]] # До тех пор, пока условие ИСТИННО (возвращает 0) выполнять тело цикла
do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
#!/usr/bin/env bash
i=0
until [[ $i -eq 10 ]] # До тех пор, пока условие ЛОЖНО (возвращает не 0) выполнять тело цикла
do
echo "$i"
i=$(($i+1))
done
#!/usr/bin/env bash
# внутри двойных круглых скобок переменные можно писать в Си-стиле (без $ и разделяя пробелом операторы и операнды)
for (( i = 0; i < 10; i++ ))
do
echo -n "$i; "
done
Массивы
[править | править код]В bash реализованы только одномерные массивы. Индексами могут быть как целочисленные значения («обычный» массив), так и строки (ассоциативный массив, или «хеш»).
Несмотря на унификацию синтаксиса для работы с обычными и ассоциативными массивами, первые не являются разновидностью вторых ни с точки зрения конечного пользователя, ни с точки зрения внутренней логики самого интерпретатора.
Как естественное следствие поддержки «ассоциативных» ключей, в bash существует крайне ограниченная возможность эмуляции многомерных массивов.
Общие операции
[править | править код]Получить значение элемента как индексированного, так и ассоциативного массива можно:
- По фиксированному значению индекса в линейном массиве или строки в ассоциативном:
declare -a arrLinear=(11 22 33 44)
declare -A arrAssoc=([city]='London' [index]='420224' )
vi=${arrLinear[3]} # vi=44
va=${arrAssoc['city']} # va='London'
- По значению переменной, при этом для индексированных массивов необязательно указывать сигил ($) перед именем переменной, используемой для индесации. Сигил перед переменной индекса обязателен в случае с ассоциативными массивами:
declare -i n=3
vi=${arrLinear[$i]} # vi=44
vi=${arrLinear[i]} # аналогично предыдущему, но без сигила
declare index='city'
va=${arrAssoc[$index]} # va='London', и это правильно
va=${arrAssoc[index]} # va='420224', и это ошибочный результат, если подразумевалось [$index]
va=${arrAssoc['index']} # va='420224'
Получить строку, состоящую из всех[52] элементов массива, разделённых пробелом.
values="${arr[@]}"
Получить строку со всеми[52] индексами или ключами массива, независимо от того, численные они или текстовые:
keys="${!arr[@]}"
Осуществить массовую замену первого вхождения подстроки «MAY» на «MARCH» во всех[52] элементах массива и вернуть строку, составленную из результирующих элементов массива, разделённых пробелом:
values="${arr[@]/MAY/MARCH}"
То же самое, но в каждом[52] элементе массива будут заменены все вхождения подстроки «MAY»:
values="${arr[@]//MAY/MARCH}"
До сих пор не все заявленные в документации возможности правильно работают для массивов. Например:
[ -v 'имя_массива' ]
неправильно срабатывает для пустого массива.[53]
Операции с индексированными массивами
[править | править код]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 fox koala turtle)
# Выводим содержимое массива:
echo "${arrAnimals[@]}"
# В конец массива arrAnimals добавляем новый элемент: "pig"
arrAnimals+=(pig)
# И снова показываем содержимое массива:
echo "${arrAnimals[@]}"
Получить первый элемент массива:
echo "${arrAnimals[0]}"
Как индексированные, так и ассоциативные массивы поддерживают так называемые «срезы»:
# Ещё один способ получить первый элемент массива
echo "${arrAnimals[@]:0:1}"
# Вывести 3 элемента массива, начиная со 2-го:
echo "${arrAnimals[@]:2:3}"
Примечание: в случае с ассоциативными массивами порядок следования значений в общем случае будет случайным (определяется используемой хеш-функцией), поэтому операция среза на ассоциативном массиве хотя и допустима, но имеет крайне ограниченную область практического применения.
В массивах с числовыми индексами допустима «обратная» («негативная») адресация, позволяющая получить доступ к элементам, начиная с конца массива:
# Значение последнего элемента массива
echo "${arrAnimals[-1]}"
# Значение предпоследнего элемента массива
echo "${arrAnimals[-2]}"
# ... и т.д.
С помощью встроенной команды mapfile (синоним: readarray) можно отображать содержимое текстового файла в индексированный массив:
declare -a fileWithLogins
mapfile fileWithLogins </etc/passwd
for ((i=0; i<${#fileWithLogins[@]}; i++))
do
echo "Line #$i: ${fileWithLogins[$i]}"
done
Операции с ассоциативными массивами
[править | править код]Начиная с версии 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"
К сожалению, в текущих версиях bash скопировать содержимое одного ассоциативного массива в другой простым присваиванием невозможно. Данную проблему можно только обойти, для чего существуют два принципиально разных подхода:
1) Эмулировать объявление второго хеша «с нуля» путём копирования объявления первого хеша:
declare -A hsh1
hsh1=(...)
source <(declare -p hsh1 | sed 's/^declare -A hsh1/declare -A hsh2/')
2) Перебрать все[52] элементы хеша-источника и скопировать их в целевой хеш:
declare -A hsh1 hsh2
hsh1=(...)
for k in "${!hsh1[@]}"
do
hsh2["$k"]="${hsh1["$k"]}"
done
Безопасная работа с массивами
[править | править код]Массивы являются удобным способом передачи динамически сгенерированных аргументов в функции или команды. При этом каждый элемент массива представляет собой отдельный аргумент.
args=( ls -l -a / )
ls "${args[@]}" # ls -l -a /
ls ${args[@]} # ls -l -a /
ls ${args[*]} # ls -l -a /
Однако при подобном использовании массивов следует быть осторожным ввиду особенностей раскрытия массивов при использовании в качестве индексов специальных символов @ и *.
Если массив заключён в кавычки и раскрывается с помощью индекса @, то образуется строка из слов, где каждое слово — отдельный элемент массива. Однако если не заключить раскрытие массива в двойные кавычки, то может получиться совсем другой результат: пробелы, входящие в состав элементов массива, становятся разделителями слов.
args=( -l -a '/home/user/Рабочий стол' )
ls "${args[@]}" # просмотр содержимого каталога '/home/user/Рабочий стол'
ls ${args[@]} # ошибка: каталогов '/home/user/Рабочий' и './стол' не существует
Массив с индексом *, заключённый в двойные кавычки, раскрывается в одну строку, соединяя все элементы массива через разделители, хранимые в переменной IFS. Если не указать двойные кавычки, то массив раскрывается аналогично раскрытию при использовании индекса @.
args=( '' usr local bin )
IFS='/' ls "${args[*]}" # просмотр содержимого каталога '/usr/local/bin'
IFS='/' ls ${args[*]} # поочерёдный просмотр содержимого каталогов '.', './usr', './local' и './bin'
При создании массива из содержимого текстовой переменной необходимо учитывать возможное наличие пробелов в тексте. Например, в качестве одного из способов создания массива из строки с перечислением можно рассматривать замену символа-разделителя на пробел. Однако наличие пробелов в разделяемых элементах приведёт к дроблению самих элементов на части.
array=( ${text//,/} ) # неправильно: текст в переменной 'text' мог содержать пробельные символы
IFS=',' array=( $text ) # правильно: раздельтельным символом является запятая.
IFS=',' read -r -a array <<< "$text" # правильно (альтернативный вариант с перенаправлением содержимого переменной 'text' в команду 'read')
К ошибкам может привести создание массива из текста, полученного в качестве вывода команд или из файла, так как не только переводы строк, но также и пробелы с символами табуляции по умолчанию будут считаться разделителями[54].
array=( "$(ls)" ) # неправильно: пробелы в названии файлов могут разбить имя файла на два элемента массива
IFS=$'\n' array=( "$(ls)" ) # правильно: разделителем будет только перевод строк
mapfile -t array < <(ls) # правильно: альтернативный вариант через встроенную команду mapfile
Конвейер
[править | править код]Конвейер передаёт вывод предыдущей команды на ввод следующей или на вход командного интерпретатора. Метод часто используется для связывания последовательности команд в единую цепочку. Конвейер обозначается символом вертикальной черты |.
Пример (grep работает как фильтр для стандартного вывода):
cat filename | grep pattern
Логические операции
[править | править код]Логическое ИЛИ обозначается как ||. В операциях проверки условий оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).
Логическое И обозначается как &&. В операциях проверки условий оператор && возвращает 0 (success) тогда и только тогда, когда оба операнда имеют значение true (ИСТИНА).
Примечание: Возможная путаница в понимании возникает из-за того, что команда true (и успешное завершение любой команды) завершается с кодом возврата 0, success (false, наоборот, не 0), в то время как логическое значение true/false — отлично от нуля/равно нулю.
Примеры:
if false; then echo "successfully"; else echo "unsuccessfully"; fi
unsuccessfully
let "a=(( 1 && 0 && 123))"; echo $?; echo $a
1 # Код завершения команды (нулевой результат вычисления арифметического выражения)
0 # Значение переменной "a", результат логической операции
if (( 1 && 0 && 123)); then echo "true"; else echo "false"; fi
false
let "a=(( 1 && 123 && -345 ))"; echo $?; echo $a
0 # Код завершения команды
1 # Значение переменной "a", результат логической операции
if (( 1 && 123 && -345 )); then echo "true"; else echo "false"; fi
true
false && echo "Успешное завершение" || echo "Неуспешное завершение"
Неуспешное завершение
Целочисленная математика
[править | править код]Bash может выполнять целочисленные вычисления внутри процесса, используя команду ((…)) и синтаксис переменной $((…))[55], как показано ниже:
VAR=55 # Устанавливаем переменную VAR, равной 55
((VAR = VAR + 1)) # Добавляем единицу к переменной VAR. Обратите внимание на отсутствие знака '$'
((VAR+=1)) # Сокращённая форма записи инкремента
((++VAR)) # Другой способ увеличения VAR на единицу. Выполняет префиксный инкремент
((VAR++)) # Другой способ увеличения VAR на единицу. Выполняет постфиксный инкремент
echo $((VAR * 22)) # Умножаем VAR на 22 и передаем результат команде
echo $[VAR * 22] # Устаревший способ сделать то же
((VAR<<3)) # Побитовый сдвиг влево (то же, что VAR*8)
((VAR>>3)) # Побитовый сдвиг вправо (то же, что VAR/8)
Команда ((…)) также может использоваться в условных утверждениях, так как её исходный параметр — это 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 — последний запущенный скрипт)
|
$# |
количество аргументов командной строки |
$* |
все[52] аргументы в виде одной строки (слова) |
$@ |
то же самое, что и $*, но при этом каждый[52] параметр представлен как отдельная строка (слово)
|
$- |
список флагов, переданных сценарию |
$_ |
содержит последний аргумент предыдущей команды |
Встроенные переменные:
$BASH |
путь к исполняемому файлу bash |
$BASHPID |
PID текущего 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.
Пример:
$ echo $(echo $BASHPID $$) $$ $BASHPID
25680 16920 16920 16920
# | | | |
# | | | -- $BASHPID outside of the subshell
# | | -- $$ outside of the subshell
# | -- $$ inside of the subshell
# -- $BASHPID inside of the subshell
Регулярные выражения внутри процесса
[править | править код]Bash 3.0 поддерживает встроенные регулярные выражения с синтаксисом, подобным синтаксису Perl:
[[string =~ regex]]
Синтаксис регулярных выражений задокументирован на страницах документации man 7 regex. Статус выхода устанавливается в 0, если регулярное выражение совпало со строкой, и 1, если нет. Значение подвыражения, заключённого в скобки, можно получить[52] через переменную ${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+! Ctrl+!: Повторить последнюю команду.
- Ctrl+a: Перемещает курсор в начало строки (эквивалентно клавише Home).
- Ctrl+b: Перемещает курсор на один символ назад (эквивалентно клавише ←).
- Ctrl+r: Поиск по набранным ранее командам.
- Ctrl+c: Посылает сигнал SIGINT текущему заданию, который обычно (но не всегда) прекращает и закрывает его.
- Ctrl+d: Посылает маркер EOF, который (если не отключено опцией и текущая строка не содержит текста) закрывает текущую оболочку (эквивалентно команде exit), при вводе в исполняющуюся программу завершает ввод, если в строке нет текста, иначе завершает строку без символа завершения строки.
- Ctrl+d: Удаляет текущий символ (только если есть текст на текущей строке) (эквивалентно клавише Delete).
- Ctrl+e: Перемещает курсор в конец строки (эквивалентно клавише End).
- Ctrl+f: Перемещает курсор на один символ вперёд (эквивалентно клавише →).
- Ctrl+h: Удаляет предыдущий символ (то же самое, что и клавиша ← Backspace).
- Ctrl+i: Эквивалентно клавише Tab ↹.
- Ctrl+j: Эквивалентно клавише ↵ Enter.
- Ctrl+k: Очищает содержимое строки после курсора и копирует это в буфер обмена экземпляра bash (kill ring).
- Ctrl+l: Очищает содержимое экрана (эквивалентно команде
clear). - Ctrl+m: Эквивалентно клавише ↵ Enter.
- Ctrl+n: (следующее) перелистывает к следующей команде (эквивалентно клавише ↓).
- Ctrl+o: Выполняет найденную команду в истории, и выбирает следующую строку относительно текущей строки в истории для того, чтобы отредактировать.
- Ctrl+p: (предыдущее) перелистывает к предшествующей команде (эквивалентно клавише ↑).
- Ctrl+q: Возобновить вывод процесса.
- Ctrl+s: Приостановить вывод процесса (stop).
- Ctrl+t: Обмен местами соседних символов.
- Ctrl+u: Очищает содержание строки до курсора и копирует его в буфер обмена экземпляра bash (kill ring).
- Ctrl+w: Убирает слово до курсора и копирует его в буфер обмена экземпляра bash (kill ring).
- Ctrl+y: добавляет содержимое буфера обмена экземпляра bash от позиции курсора.
- Ctrl+z: Посылает сигнал SIGTSTP текущему заданию, который приостанавливает его выполнение, и возобновляет приём команд. Для возобновления его выполнения в фоновом режиме можно ввести команду bg. Для того, чтобы вернуть его из фонового режима или приостановки, можно выполнить fg.
- Ctrl+/: Прервать текущий процесс с дампом памяти (core dump), послав ему сигнал.
- Ctrl+_ (Ctrl+⇧ Shift+-): Откат редактирования.
- Alt+>: переход к последней команде в истории.
- Alt+b: (назад) перемещает курсор назад на одно слово (эквивалентно клавише Ctrl+←).
- Alt+d: Сокращает слово после курсора.
- Alt+f: (вперёд) перемещает курсор вперёд на одно слово (эквивалентно клавише Ctrl+→).
- Alt+t: Меняет два слова перед курсором местами.
- Alt+.: Добавляет последний аргумент предыдущей команды.
- Alt+c: Заменить букву под курсором на заглавную.
- Alt+l: Заменить букву под курсором на строчную.
- Ctrl+x Ctrl+x: Переносит курсор к началу строки от текущей позиции, и обратно.
- 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.
Переносимость
[править | править код]Первой строкой скрипта должна быть запись #!/bin/bash, если известен абсолютный путь к исполняемому файлу, либо #!/usr/bin/env bash для автоматического определения пути к исполняемому файлу через команду env с помощью переменной окружения PATH[56].
Скрипты оболочек, написанные со специфическими для bash особенностями, не будут работать на системах, где используется Bourne shell (sh) или один из его аналогов, если bash не был установлен в качестве дополнительной оболочки. Эта проблема стала особенно важной, когда Ubuntu начал с октября 2006 года поставлять Debian Almquist shell (dash) как скриптовую оболочку по умолчанию, что привело к неработоспособности многочисленных скриптов.
Графический интерфейс к скриптам
[править | править код]Существует множество программ, позволяющих создавать графический интерфейс к bash-скриптам.
- dialog — утилита, позволяющая создавать диалоговые окна в консоли, использует библиотеки curses и ncurses.
- whiptail — аналог утилиты dialog, использует библиотеку newt.
- zenity — наиболее популярное приложение для создания графического интерфейса к скриптам.
- kdialog — аналог zenity в среде KDE.
- yad — форк zenity, с большими возможностями.
- xdialog — замена dialog, предназначенная для придания запускаемым из терминала программам интерфейса X Window System.
- gtkdialog — наиболее функциональная утилита для создания графических приложений на bash-скриптах.
См. также
[править | править код]Примечания
[править | править код]- ↑ Ramey C. Bash-5.3-release available (англ.) — 2025.
- ↑ GNU Bash. Free Software Foundation, Inc.. GNU Project. — «Bash is free software, distributed under the terms of the [GNU] General Public License as published by the Free Software Foundation, version 3 of the License (or any later version).» Дата обращения: 8 августа 2025. Архивировано 26 апреля 2019 года.
- ↑ bash-1.11. oldlinux.org. — «See test.c for GPL-2.0-or-later». Дата обращения: 8 августа 2025. Архивировано 15 октября 2021 года.
- ↑ BashFAQ/061: Is there a list of which features were added to specific releases (versions) of Bash? wooledge.org. Дата обращения: 8 августа 2025. Архивировано 2 марта 2021 года.
- ↑ bash-1.05. oldlinux.org. Дата обращения: 8 августа 2025. Архивировано 6 мая 2021 года.
- ↑ Is there a way to download the presumably initial bash source bash-0.99? unix.stackexchange.com. Дата обращения: 8 августа 2025.
- ↑ William McCarty. Learning Debian GNU/Linux. 13. Conquering the BASH Shell (англ.). O'Reilly Media (6 октября 1999). Дата обращения: 6 декабря 2018. Архивировано 9 ноября 2017 года.
- ↑ In Unix, what do some obscurely named commands stand for? iu.edu. Indiana University (5 февраля 2009). Дата обращения: 8 августа 2025. Архивировано 10 июня 2010 года.
- ↑ Louis Pouzin. The Origin of the Shell. multicians.org (25 ноября 2000).
- ↑ The SHELL, A Global Tool for Calling and Chaining Procedures in the System. mit.edu.
- ↑ Cerf, Vint. ASCII Format for Network Interchange. ietf.org. UCLA, Network Working Group (16 октября 1969). Дата обращения: 8 августа 2025.
- ↑ 1 2
Stallman, Richard; Ramey, Chet (10 февраля 1988). GNU + BSD = ?. google.com. Newsgroup: comp.unix.questions. Usenet: 2362@mandrill.CWRU.Edu. Архивировано 28 декабря 2021. Дата обращения: 28 декабря 2021.
For a year and a half, the GNU shell was "just about done". The author made repeated promises to deliver what he had done, and never kept them. Finally I could no longer believe he would ever deliver anything. So Foundation staff member Brian Fox is now implementing an imitation of the Bourne shell.
. - ↑ Stallman, Richard. About the GNU Project. Free Software Foundation, Inc.. GNU Project (3 октября 2010). — «Free Software Foundation employees have written and maintained a number of GNU software packages. Two notable ones are the C library and the shell. ... We funded development of these programs because the GNU Project was not just about tools or a development environment. Our goal was a complete operating system, and these programs were needed for that goal.» Дата обращения: 8 августа 2025. Архивировано 24 апреля 2011 года.
- ↑ Fox, Brian; Tower Jr., Leonard H. (8 июня 1989). Bash is in beta release!. google.com. Newsgroup: gnu.announce. Архивировано 4 мая 2013. Дата обращения: 28 октября 2010.
- ↑ Evolution of shells in Linux. ibm.com. IBM (9 декабря 2011).
- ↑
Torvalds, Linus (26 августа 1991). What would you like to see most in Minix?. google.com. Newsgroup: comp.os.minix. Дата обращения: 8 августа 2025.
To make things really clear - yes I can run gcc on it, and bash, and most of the gnu [bin/file]utilities
. - ↑ January 1993 GNU's Bulletin. google.com. Newsgroup: gnu.announce. 20 апреля 1993. Usenet: gnusenet930421bulletin@prep.ai.mit.edu. Архивировано 2 марта 2021. Дата обращения: 28 октября 2010.
- ↑ Ramey, Chet. Bash – the GNU shell (Reflections and Lessons Learned). linuxjournal.com. Linux Journal (1 августа 1994). Дата обращения: 13 ноября 2008. Архивировано 5 декабря 2008 года.
- ↑ Ramey, Chet (31 октября 2010), Dates in your Computerworld interview, scribd.com, Архивировано 20 июля 2012, Дата обращения: 31 октября 2010
- ↑ Ошибка в сносках?: Неверный тег
<ref>; для сносокbash-topне указан текст - ↑
- Ramey, Chet (12 июня 1989). Bash 0.99 fixes & improvements. google.com. Newsgroup: gnu.bash.bug. Архивировано 10 ноября 2012. Дата обращения: 1 ноября 2010.
- Ramey, Chet (24 июля 1989). Some bash-1.02 fixes. google.com. Newsgroup: gnu.bash.bug. Архивировано 10 ноября 2012. Дата обращения: 30 октября 2010.
- Fox, Brian (2 марта 1990). Availability of bash 1.05. google.com. Newsgroup: gnu.bash.bug. Архивировано 10 ноября 2012. Дата обращения: 30 октября 2010.
- ↑ Ошибка в сносках?: Неверный тег
<ref>; для сносокcomputerworld_08не указан текст - ↑ Ошибка в сносках?: Неверный тег
<ref>; для сносокgoftw2015не указан текст - ↑ Bresnahan, Christine. CompTIA Linux+ Powered by Linux Professional Institute Study Guide: Exam LX0-103 and Exam LX0-104 / Christine Bresnahan, Richard Blum. — 3rd. — John Wiley & Sons, Inc., April 2015. — P. 5. — «In Linux, most users run bash because it is the most popular shell.». — ISBN 978-1-119-02122-3.
- ↑ Danesh, Arman. Mastering Linux / Arman Danesh, Michael Jang. — John Wiley & Sons, Inc., February 2006. — P. 363. — «The Bourne Again Shell (bash) is the most common shell installed with Linux distributions.». — ISBN 978-0-7821-5277-7.
- ↑ Debian Wiki: Shell. debian.org.
- ↑ Ramey, Chet (14 сентября 2000). Re: Line-Edit mode is lost if "set -o vi" is in any files sourced on login. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Ramey, Chet (9 апреля 2001). Bash-2.05 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Essential Mac OS S Panther Server Administration, pg 189
- ↑ Foster-Johnson, Eric. Beginning Shell Scripting / Eric Foster-Johnson, John C. Welch, Micah Anderson. — John Wiley & Sons, Inc., April 2005. — P. 6. — «Bash is by far the most popular shell and forms the default shell on Linux and Mac OSX systems.». — ISBN 978-0-7645-9791-6.
- ↑ Bash-3.0 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-3.1 released. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-3.2 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-4.0 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-4.1 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-4.2 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ User Environment Feature Changes. oracle.com. Oracle Corporation. Дата обращения: 8 августа 2025. Архивировано 12 июня 2018 года.
- ↑ Bash-4.3 available for FTP. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ CVE-2014-6271. cve.org. — «GNU Bash through 4.3 processes trailing strings after function definitions in the values of environment variables, which allows remote attackers to execute arbitrary code via a crafted environment, as demonstrated by vectors involving the ForceCommand feature in OpenSSH sshd, the mod_cgi and mod_cgid modules in the Apache HTTP Server, scripts executed by unspecified DHCP clients, and other situations in which setting the environment occurs across a privilege boundary from Bash execution, aka "ShellShock."». Дата обращения: 8 августа 2025.
- ↑ CVE-2014-7169. cve.org. Дата обращения: 8 августа 2025.
- ↑ Bash 3.0 Official Patch 1. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Briegel, Armin. Moving to zsh. scriptingosx.com (5 июня 2019). Дата обращения: 8 августа 2025.
- ↑ Apple Support – Use zsh as the default shell on your Mac. apple.com. Дата обращения: 8 августа 2025. Архивировано 2 декабря 2019 года.
- ↑ Warren, Tom. Apple replaces bash with zsh as the default shell in macOS Catalina. theverge.com. The Verge (4 июня 2019). — «The bash binary bundled with macOS has been stuck on version 3.2 for a long time now. Bash v4 was released in 2009 and bash v5 in January 2019. The reason Apple has not switched to these newer versions is that they are licensed with GPL v3. Bash v3 is still GPL v2.» Дата обращения: 8 августа 2025. Архивировано 10 июня 2019 года.
- ↑ Hughes, Matthew. Why does macOS Catalina use Zsh instead of Bash? Licensing (амер. англ.). The Next Web (4 июня 2019). Дата обращения: 8 августа 2025. Архивировано 31 декабря 2020 года.
- ↑ Bash-5.0 release available. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Bash-5.1 release available. bug-bash (Mailing list). GNU Project. Дата обращения: 8 августа 2025.
- ↑ Невозможно вывести значение переменной, содержащей
-n(в отличие отprintf -- '%s\n' "${переменная}"), так как-nинтерпретируется как параметр командыecho. - ↑ Bash Reference Manual Архивная копия от 13 мая 2019 на Wayback Machine.
- ↑ Bash News. Дата обращения: 18 января 2017. Архивировано 1 февраля 2017 года.
- ↑ BashGuide/TestsAndConditionals Архивная копия от 12 февраля 2014 на Wayback Machine — Greg’s Wiki.
- ↑ 1 2 3 4 5 6 7 8 Для получения действительно всех элементов, включая элементы из пробелов и пустые строки, обязательно использовать кавычки.
- ↑ Здесь апострофы употреблены правильно.
- ↑ bash(1): GNU Bourne-Again SHell — Linux man page (англ.). linux.die.net. Дата обращения: 11 июля 2017. Архивировано 27 декабря 2019 года.
- ↑ Устаревший вариант:
$[…]. - ↑ env(1) — Linux manual page. man7.org. Дата обращения: 21 января 2017. Архивировано 13 января 2017 года.
Ссылки
[править | править код]- Bash Reference Manual (англ.). — Официальное руководство. Дата обращения: 22 ноября 2010. Архивировано из оригинала 23 августа 2011 года.
- Bash Reference Manual. — Перевод man-страницы от 2004 года. Архивировано из оригинала 23 апреля 2012 года.
- Advanced Bash-Scripting Guide. — Расширенное руководство по написанию bash-скриптов. Дата обращения: 6 августа 2011. Архивировано из оригинала 28 августа 2011 года.
- Частые ошибки программирования на Bash. Дата обращения: 22 ноября 2010. Архивировано из оригинала 23 августа 2011 года.
- Введение в программирование на bash. Дата обращения: 22 ноября 2010. Архивировано из оригинала 27 августа 2011 года.
- Bash. openSuse wiki. Дата обращения: 22 ноября 2010. Архивировано из оригинала 23 августа 2011 года.
- Описание команд bash (англ.). Дата обращения: 22 ноября 2010. Архивировано из оригинала 23 августа 2011 года.
- Ян Шилдс (Ian Shields). Полезные советы Linux: Параметры bash и расширения параметров. Архивировано из оригинала 15 октября 2012 года.