bash

Поделись знанием:
Перейти к: навигация, поиск

GNU Bourne-Again SHell

Типичная сессия в bash
Тип

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

Автор

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

Разработчик

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

Написана на

Си

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

UNIX-подобные

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

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

Лицензия

GNU General Public License

Сайт

[www.gnu.org/software/bash/ .org/software/bash/]

BashBash

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

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

Название «bash» является акронимом от Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.

В сентябре 2014 года в bash была обнаружена широко эксплуатируемая уязвимость Bashdoor.





Отличия в синтаксисе

Подавляющее большинство важных скриптов командного процессора Bourne могут выполняться без изменения в bash, за исключением тех, которые ссылаются на специальные переменные Bourne или используют встроенные команды Bourne. Синтаксис команд Bash включает идеи, заимствованные у Korn shell (ksh) и C shell (csh), такие как редактирование командной строки, история команд, стек каталогов, переменные $RANDOM и $PPID, синтаксис замены команды $(…). Когда Bash используется как интерактивный командный процессор, он поддерживает автозавершение имён программ, файлов, переменных и т. п. с помощью клавиши Tab .

Внутренние команды

Ввод-вывод
echo выводит выражение или содержимое переменной (на stdout) (работает не всегда)[2]
printf команда форматированного вывода, расширенный вариант команды echo
read «читает» значение переменной со стандартного ввода (stdin), в интерактивном режиме это клавиатура
Файловая система
cd изменяет текущий каталог
pwd выводит название текущего рабочего каталога (от англ. print working directory)
pushd изменяет текущий каталог с возможностью возврата в обратном порядке
popd возвращает текущий каталог после pushd
Действия над переменными
let производит арифметические операции над переменными
eval транслирует список аргументов из списка в команды
set изменяет значения внутренних переменных скрипта
unset удаляет переменную (фактически устанавливает её значение в null)К:Википедия:Статьи без источников (тип: не указан)[источник не указан 2849 дней]
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.[3]

«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.2 стало возможным указывать в одной строке терминирующую последовательность символов и, сразу за ней, - скобку. Это может быть полезно для присвоения переменной содержимого 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

Обратите внимание, что кавычки вокруг левой части необязательны.[4]

Циклы

#!/usr/bin/env bash
for i in n{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
  echo "$i"
  i=$(($i+1))
done
#!/usr/bin/env bash
# внутри двойных круглых скобок переменные можно писать в Си-стиле (без $ и разделяя пробелом операторы и операнды)
for (( i = 0; i < 10; i++ ))
do
	echo -n "$i; "
done

Массивы

В BASH реализованы только одномерные массивы. Индексами могут быть как целочисленные значения (в этом случае массив представляет собой вектор), так и строки (ассоциативный массив или «хеш»).

Несмотря на унификацию синтаксиса для работы с векторами и ассоциативными массивами, первые не являются разновидностью вторых ни с точки зрения конечного пользователя, ни с точки зрения внутренней логики самого интерпретатора.

Как естественное следствие поддержки «ассоциативных» ключей в BASH существует крайне ограниченная возможность эмуляции многомерных массивов.

Общие операции

Получить строку, состоящую из всех[5] элементов массива, разделённых пробелом.

values="${arr[@]}"

Получить строку со всеми[5] индексами или ключами массива, независимо от того, численные они или текстовые:

keys="${!arr[@]}"

Осуществить массовую замену первого вхождения подстроки «MAY» на «MARCH» во всех[5] элементах массива и вернуть строку, составленную из результирующих элементов массива, разделённых пробелом:

values="${arr[@]/MAY/MARCH}"

То же самое, но в каждом[5] элементе массива будут заменены все вхождения подстроки «MAY»:

values="${arr[@]//MAY/MARCH}"
До сих пор не все заявленные в документации возможности правильно работают для массивов. Например:
[ -v 'имя_массива' ]
неправильно срабатывает для пустого массива.[6]

Операции с индексированными массивами

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) Перебрать все[5] элементы хеша-источника и скопировать их в целевой хеш:

declare -A hsh1 hsh2
hsh1=(...)

for k in "${!hsh1[@]}"
do
	hsh2["$k"]="${hsh1["$k"]}"
done

Конвейер

Конвейер передаёт вывод предыдущей команды на ввод следующей или на вход командного интерпретатора. Метод часто используется для связывания последовательности команд в единую цепочку. Конвейер обозначается следующим символом: |.

Пример (grep работает как фильтр для стандартного вывода):

cat filename | grep pattern

Логические операции

|| логическая операция OR (логическое ИЛИ). В операциях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).

&& логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).

Целочисленная математика

Bash может выполнять целочисленные вычисления внутри процесса используя команду ((…)) и синтаксис переменной $((…))[7], как показано ниже:

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 — последний запущенный скрипт)
$# количество аргументов командной строки
$* все[5] аргументы в виде одной строки (слова)
$@ то же самое, что и $*, но при этом каждый[5] параметр представлен как отдельная строка (слово)
$- список флагов, переданных сценарию
$_ содержит последний аргумент предыдущей команды

Встроенные переменные:

$BASH путь к исполняемому файлу bash
$BASH_VERSINFO[n] массив, состоящий из 6 элементов, содержащий информацию о версии bash
$BASH_VERSION версия Bash, установленного в системе
$DIRSTACK содержимое вершины стека каталогов
$EDITOR заданный по умолчанию редактор
$EUID «эффективный» идентификационный номер пользователя (Effective User ID)
$FUNCNAME имя текущей функции
$GLOBIGNORE перечень шаблонных символов, которые будут проигнорированы при выполнении подстановки имен файлов (globbing)
$GROUPS группы, к которым принадлежит текущий пользователь
$HOME домашний каталог пользователя
$HOSTNAME сетевое имя хоста
$HOSTTYPE тип машины (идентифицирует аппаратную архитектуру)
$IFS разделитель полей во вводимой строке
$LC_COLLATE задает порядок сортировки символов, в операциях подстановки имен файлов и в поиске по шаблону
$LC_CTYPE определяет кодировку символов
$LINENO Номер строки исполняемого сценария
$MACHTYPE аппаратная архитектура
$OLDPWD прежний рабочий каталог
$OSTYPE тип операционной системы
$PATH путь поиска (включает в себя каталоги /usr/bin/, /usr/X11R6/bin/, /usr/local/bin и т. д.)
$PIPESTATUS Код возврата канала (конвейера)
$PPID PID (идентификатор) родительского процесса
$PS1 приглашение командной строки
$PS2 вторичное приглашение командной строки, выводится тогда, когда от пользователя ожидается дополнительный ввод. Обычно отображается как «>»
$PS3 третичное приглашение, выводится, когда пользователь должен сделать выбор в операторе select
$PS4 приглашение четвёртого уровня, выводится (в изменённом виде) в начале каждой строки отладочного вывода тогда, когда сценарий вызывается с ключом -x. Обычно отображается как «+», «++» и т. д.
$PWD рабочий (текущий) каталог
$REPLY переменная по умолчанию, куда записывается ввод пользователя, выполненный с помощью команды read
$SECONDS время работы сценария (в секундах)
$SHELLOPTS список допустимых опций интерпретатора (доступна только для чтения)
$SHLVL уровень вложенности shell

Регулярные выражения внутри процесса

Bash 3.0 поддерживает встроенные регулярные выражения, с синтаксисом подобным синтаксису Perl:

[[ string =~ regex ]]

Синтаксис регулярных выражений задокументирован на страницах документации man 7 regex. Статус выхода устанавливается в 0, если регулярное выражение совпало со строкой, и 1, если нет. Значение подвыражения, заключённого в скобки, можно получить[5] через переменную "${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.

Переносимость

Скрипты оболочек, написанные со специфическими для bash особенностями (bash-измы) не будут работать на системах, где используется Bourne shell или один из его заменителей, без того, чтобы bash был установлен как дополнительная оболочка, и, конечно, скрипты надо начинать с #!/bin/bashК:Википедия:Статьи без источников (тип: не указан)[источник не указан 2849 дней]. Эта проблема стала особенно важной, когда Ubuntu начал с октября 2006 года поставлять Debian Almquist shell (dash) как скриптовую оболочку по умолчанию, что привело к неработоспособности многочисленных скриптов.

Графический интерфейс к скриптам

Существует множество программ, позволяющих создавать графический интерфейс к bash-скриптам. Наиболее популярныеК:Википедия:Статьи без источников (тип: не указан)[источник не указан 4021 день]:

  • dialog — утилита, позволяющая создавать диалоговые окна в консоли, использует библиотеки curses и ncurses.
  • whiptail — аналог утилиты dialog, использует библиотеку newt.
  • zenity — наиболее популярное приложение, для создания графического интерфейса к скриптам.
  • kdialog — аналог zenity в среде KDE.
  • yad — форк zenity, с большими возможностями.
  • xdialog — замена dialog, предназначенная для придания запускаемым из терминала программам X Window System интерфейса.
  • gtkdialog — наиболее функциональная утилита для создания gui-приложений на bash-скриптах.

См. также

Напишите отзыв о статье "Bash"

Примечания

  1. [oreilly.com/openbook/debian/book/ch13_01.html Bill McCarty, Learning Debian GNU/Linux / Conquering the BASH Shell]
  2. не в силах вывести даже значение переменной, содержащей «-n», в отличие от printf -- '%s\n' "${переменная}"
  3. [www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual]
  4. [mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29 BashGuide/TestsAndConditionals — Greg’s Wiki]
  5. 1 2 3 4 5 6 7 8 для получения действительно всех элементов, включая элементы из пробелов и пустые строки, обязательно использовать кавычки
  6. Здесь апострофы употреблены правильно.
  7. устаревший вариант: $[…]

Ссылки

  • [www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual] (англ.). — Официальное руководство. Проверено 22 ноября 2010. [www.webcitation.org/618xRKJBw Архивировано из первоисточника 23 августа 2011].
  • [citforum.ru/operating_systems/manpages/bash/index.shtml Bash Reference Manual]. — Перевод man-страницы от 2004 года. [www.webcitation.org/67lAXmJRg Архивировано из первоисточника 18 мая 2012].
  • [rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html Advanced Bash-Scripting Guide] (рус.). — Расширенное руководство по написанию bash-скриптов. Проверено 6 августа 2011. [www.webcitation.org/618xOJBEY Архивировано из первоисточника 23 августа 2011].
  • [bappoy.pp.ru/tag/bash-pitfalls Частые ошибки программирования на Bash]. Проверено 22 ноября 2010. [www.webcitation.org/618xPFpAF Архивировано из первоисточника 23 августа 2011].
  • [ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/Bash-Prog-Intro.html Введение в программирование на bash]. Проверено 22 ноября 2010. [www.webcitation.org/618xNqOPv Архивировано из первоисточника 23 августа 2011].
  • [ru.opensuse.org/Bash Bash] (рус.). openSuse wiki. Проверено 22 ноября 2010. [www.webcitation.org/618xQ1ft3 Архивировано из первоисточника 23 августа 2011].
  • [www.ss64.com/bash/ Описание команд bash] (англ.). Проверено 22 ноября 2010. [www.webcitation.org/618xQrWNK Архивировано из первоисточника 23 августа 2011].
  • Ян Шилдс (Ian Shields). [www.ibm.com/developerworks/ru/library/l-bash-parameters/index.html?ca=dre-ru Полезные советы Linux: Параметры bash и расширения параметров] (рус.). [www.webcitation.org/6BQdrirVt Архивировано из первоисточника 15 октября 2012].

Отрывок, характеризующий Bash

Князь Андрей нахмурившись молчал.
– Вы ведь дружны с Борисом? – сказала ему Вера.
– Да, я его знаю…
– Он верно вам говорил про свою детскую любовь к Наташе?
– А была детская любовь? – вдруг неожиданно покраснев, спросил князь Андрей.
– Да. Vous savez entre cousin et cousine cette intimite mene quelquefois a l'amour: le cousinage est un dangereux voisinage, N'est ce pas? [Знаете, между двоюродным братом и сестрой эта близость приводит иногда к любви. Такое родство – опасное соседство. Не правда ли?]
– О, без сомнения, – сказал князь Андрей, и вдруг, неестественно оживившись, он стал шутить с Пьером о том, как он должен быть осторожным в своем обращении с своими 50 ти летними московскими кузинами, и в середине шутливого разговора встал и, взяв под руку Пьера, отвел его в сторону.
– Ну что? – сказал Пьер, с удивлением смотревший на странное оживление своего друга и заметивший взгляд, который он вставая бросил на Наташу.
– Мне надо, мне надо поговорить с тобой, – сказал князь Андрей. – Ты знаешь наши женские перчатки (он говорил о тех масонских перчатках, которые давались вновь избранному брату для вручения любимой женщине). – Я… Но нет, я после поговорю с тобой… – И с странным блеском в глазах и беспокойством в движениях князь Андрей подошел к Наташе и сел подле нее. Пьер видел, как князь Андрей что то спросил у нее, и она вспыхнув отвечала ему.
Но в это время Берг подошел к Пьеру, настоятельно упрашивая его принять участие в споре между генералом и полковником об испанских делах.
Берг был доволен и счастлив. Улыбка радости не сходила с его лица. Вечер был очень хорош и совершенно такой, как и другие вечера, которые он видел. Всё было похоже. И дамские, тонкие разговоры, и карты, и за картами генерал, возвышающий голос, и самовар, и печенье; но одного еще недоставало, того, что он всегда видел на вечерах, которым он желал подражать.
Недоставало громкого разговора между мужчинами и спора о чем нибудь важном и умном. Генерал начал этот разговор и к нему то Берг привлек Пьера.


На другой день князь Андрей поехал к Ростовым обедать, так как его звал граф Илья Андреич, и провел у них целый день.
Все в доме чувствовали для кого ездил князь Андрей, и он, не скрывая, целый день старался быть с Наташей. Не только в душе Наташи испуганной, но счастливой и восторженной, но во всем доме чувствовался страх перед чем то важным, имеющим совершиться. Графиня печальными и серьезно строгими глазами смотрела на князя Андрея, когда он говорил с Наташей, и робко и притворно начинала какой нибудь ничтожный разговор, как скоро он оглядывался на нее. Соня боялась уйти от Наташи и боялась быть помехой, когда она была с ними. Наташа бледнела от страха ожидания, когда она на минуты оставалась с ним с глазу на глаз. Князь Андрей поражал ее своей робостью. Она чувствовала, что ему нужно было сказать ей что то, но что он не мог на это решиться.
Когда вечером князь Андрей уехал, графиня подошла к Наташе и шопотом сказала:
– Ну что?
– Мама, ради Бога ничего не спрашивайте у меня теперь. Это нельзя говорить, – сказала Наташа.
Но несмотря на то, в этот вечер Наташа, то взволнованная, то испуганная, с останавливающимися глазами лежала долго в постели матери. То она рассказывала ей, как он хвалил ее, то как он говорил, что поедет за границу, то, что он спрашивал, где они будут жить это лето, то как он спрашивал ее про Бориса.
– Но такого, такого… со мной никогда не бывало! – говорила она. – Только мне страшно при нем, мне всегда страшно при нем, что это значит? Значит, что это настоящее, да? Мама, вы спите?
– Нет, душа моя, мне самой страшно, – отвечала мать. – Иди.
– Все равно я не буду спать. Что за глупости спать? Maмаша, мамаша, такого со мной никогда не бывало! – говорила она с удивлением и испугом перед тем чувством, которое она сознавала в себе. – И могли ли мы думать!…
Наташе казалось, что еще когда она в первый раз увидала князя Андрея в Отрадном, она влюбилась в него. Ее как будто пугало это странное, неожиданное счастье, что тот, кого она выбрала еще тогда (она твердо была уверена в этом), что тот самый теперь опять встретился ей, и, как кажется, неравнодушен к ней. «И надо было ему нарочно теперь, когда мы здесь, приехать в Петербург. И надо было нам встретиться на этом бале. Всё это судьба. Ясно, что это судьба, что всё это велось к этому. Еще тогда, как только я увидала его, я почувствовала что то особенное».
– Что ж он тебе еще говорил? Какие стихи то эти? Прочти… – задумчиво сказала мать, спрашивая про стихи, которые князь Андрей написал в альбом Наташе.
– Мама, это не стыдно, что он вдовец?
– Полно, Наташа. Молись Богу. Les Marieiages se font dans les cieux. [Браки заключаются в небесах.]
– Голубушка, мамаша, как я вас люблю, как мне хорошо! – крикнула Наташа, плача слезами счастья и волнения и обнимая мать.
В это же самое время князь Андрей сидел у Пьера и говорил ему о своей любви к Наташе и о твердо взятом намерении жениться на ней.

В этот день у графини Елены Васильевны был раут, был французский посланник, был принц, сделавшийся с недавнего времени частым посетителем дома графини, и много блестящих дам и мужчин. Пьер был внизу, прошелся по залам, и поразил всех гостей своим сосредоточенно рассеянным и мрачным видом.
Пьер со времени бала чувствовал в себе приближение припадков ипохондрии и с отчаянным усилием старался бороться против них. Со времени сближения принца с его женою, Пьер неожиданно был пожалован в камергеры, и с этого времени он стал чувствовать тяжесть и стыд в большом обществе, и чаще ему стали приходить прежние мрачные мысли о тщете всего человеческого. В это же время замеченное им чувство между покровительствуемой им Наташей и князем Андреем, своей противуположностью между его положением и положением его друга, еще усиливало это мрачное настроение. Он одинаково старался избегать мыслей о своей жене и о Наташе и князе Андрее. Опять всё ему казалось ничтожно в сравнении с вечностью, опять представлялся вопрос: «к чему?». И он дни и ночи заставлял себя трудиться над масонскими работами, надеясь отогнать приближение злого духа. Пьер в 12 м часу, выйдя из покоев графини, сидел у себя наверху в накуренной, низкой комнате, в затасканном халате перед столом и переписывал подлинные шотландские акты, когда кто то вошел к нему в комнату. Это был князь Андрей.
– А, это вы, – сказал Пьер с рассеянным и недовольным видом. – А я вот работаю, – сказал он, указывая на тетрадь с тем видом спасения от невзгод жизни, с которым смотрят несчастливые люди на свою работу.
Князь Андрей с сияющим, восторженным и обновленным к жизни лицом остановился перед Пьером и, не замечая его печального лица, с эгоизмом счастия улыбнулся ему.
– Ну, душа моя, – сказал он, – я вчера хотел сказать тебе и нынче за этим приехал к тебе. Никогда не испытывал ничего подобного. Я влюблен, мой друг.
Пьер вдруг тяжело вздохнул и повалился своим тяжелым телом на диван, подле князя Андрея.
– В Наташу Ростову, да? – сказал он.
– Да, да, в кого же? Никогда не поверил бы, но это чувство сильнее меня. Вчера я мучился, страдал, но и мученья этого я не отдам ни за что в мире. Я не жил прежде. Теперь только я живу, но я не могу жить без нее. Но может ли она любить меня?… Я стар для нее… Что ты не говоришь?…
– Я? Я? Что я говорил вам, – вдруг сказал Пьер, вставая и начиная ходить по комнате. – Я всегда это думал… Эта девушка такое сокровище, такое… Это редкая девушка… Милый друг, я вас прошу, вы не умствуйте, не сомневайтесь, женитесь, женитесь и женитесь… И я уверен, что счастливее вас не будет человека.
– Но она!
– Она любит вас.
– Не говори вздору… – сказал князь Андрей, улыбаясь и глядя в глаза Пьеру.
– Любит, я знаю, – сердито закричал Пьер.
– Нет, слушай, – сказал князь Андрей, останавливая его за руку. – Ты знаешь ли, в каком я положении? Мне нужно сказать все кому нибудь.
– Ну, ну, говорите, я очень рад, – говорил Пьер, и действительно лицо его изменилось, морщина разгладилась, и он радостно слушал князя Андрея. Князь Андрей казался и был совсем другим, новым человеком. Где была его тоска, его презрение к жизни, его разочарованность? Пьер был единственный человек, перед которым он решался высказаться; но зато он ему высказывал всё, что у него было на душе. То он легко и смело делал планы на продолжительное будущее, говорил о том, как он не может пожертвовать своим счастьем для каприза своего отца, как он заставит отца согласиться на этот брак и полюбить ее или обойдется без его согласия, то он удивлялся, как на что то странное, чуждое, от него независящее, на то чувство, которое владело им.
– Я бы не поверил тому, кто бы мне сказал, что я могу так любить, – говорил князь Андрей. – Это совсем не то чувство, которое было у меня прежде. Весь мир разделен для меня на две половины: одна – она и там всё счастье надежды, свет; другая половина – всё, где ее нет, там всё уныние и темнота…
– Темнота и мрак, – повторил Пьер, – да, да, я понимаю это.
– Я не могу не любить света, я не виноват в этом. И я очень счастлив. Ты понимаешь меня? Я знаю, что ты рад за меня.
– Да, да, – подтверждал Пьер, умиленными и грустными глазами глядя на своего друга. Чем светлее представлялась ему судьба князя Андрея, тем мрачнее представлялась своя собственная.


Для женитьбы нужно было согласие отца, и для этого на другой день князь Андрей уехал к отцу.
Отец с наружным спокойствием, но внутренней злобой принял сообщение сына. Он не мог понять того, чтобы кто нибудь хотел изменять жизнь, вносить в нее что нибудь новое, когда жизнь для него уже кончалась. – «Дали бы только дожить так, как я хочу, а потом бы делали, что хотели», говорил себе старик. С сыном однако он употребил ту дипломацию, которую он употреблял в важных случаях. Приняв спокойный тон, он обсудил всё дело.
Во первых, женитьба была не блестящая в отношении родства, богатства и знатности. Во вторых, князь Андрей был не первой молодости и слаб здоровьем (старик особенно налегал на это), а она была очень молода. В третьих, был сын, которого жалко было отдать девчонке. В четвертых, наконец, – сказал отец, насмешливо глядя на сына, – я тебя прошу, отложи дело на год, съезди за границу, полечись, сыщи, как ты и хочешь, немца, для князя Николая, и потом, ежели уж любовь, страсть, упрямство, что хочешь, так велики, тогда женись.
– И это последнее мое слово, знай, последнее… – кончил князь таким тоном, которым показывал, что ничто не заставит его изменить свое решение.
Князь Андрей ясно видел, что старик надеялся, что чувство его или его будущей невесты не выдержит испытания года, или что он сам, старый князь, умрет к этому времени, и решил исполнить волю отца: сделать предложение и отложить свадьбу на год.
Через три недели после своего последнего вечера у Ростовых, князь Андрей вернулся в Петербург.

На другой день после своего объяснения с матерью, Наташа ждала целый день Болконского, но он не приехал. На другой, на третий день было то же самое. Пьер также не приезжал, и Наташа, не зная того, что князь Андрей уехал к отцу, не могла себе объяснить его отсутствия.
Так прошли три недели. Наташа никуда не хотела выезжать и как тень, праздная и унылая, ходила по комнатам, вечером тайно от всех плакала и не являлась по вечерам к матери. Она беспрестанно краснела и раздражалась. Ей казалось, что все знают о ее разочаровании, смеются и жалеют о ней. При всей силе внутреннего горя, это тщеславное горе усиливало ее несчастие.
Однажды она пришла к графине, хотела что то сказать ей, и вдруг заплакала. Слезы ее были слезы обиженного ребенка, который сам не знает, за что он наказан.
Графиня стала успокоивать Наташу. Наташа, вслушивавшаяся сначала в слова матери, вдруг прервала ее:
– Перестаньте, мама, я и не думаю, и не хочу думать! Так, поездил и перестал, и перестал…
Голос ее задрожал, она чуть не заплакала, но оправилась и спокойно продолжала: – И совсем я не хочу выходить замуж. И я его боюсь; я теперь совсем, совсем, успокоилась…
На другой день после этого разговора Наташа надела то старое платье, которое было ей особенно известно за доставляемую им по утрам веселость, и с утра начала тот свой прежний образ жизни, от которого она отстала после бала. Она, напившись чаю, пошла в залу, которую она особенно любила за сильный резонанс, и начала петь свои солфеджи (упражнения пения). Окончив первый урок, она остановилась на середине залы и повторила одну музыкальную фразу, особенно понравившуюся ей. Она прислушалась радостно к той (как будто неожиданной для нее) прелести, с которой эти звуки переливаясь наполнили всю пустоту залы и медленно замерли, и ей вдруг стало весело. «Что об этом думать много и так хорошо», сказала она себе и стала взад и вперед ходить по зале, ступая не простыми шагами по звонкому паркету, но на всяком шагу переступая с каблучка (на ней были новые, любимые башмаки) на носок, и так же радостно, как и к звукам своего голоса прислушиваясь к этому мерному топоту каблучка и поскрипыванью носка. Проходя мимо зеркала, она заглянула в него. – «Вот она я!» как будто говорило выражение ее лица при виде себя. – «Ну, и хорошо. И никого мне не нужно».
Лакей хотел войти, чтобы убрать что то в зале, но она не пустила его, опять затворив за ним дверь, и продолжала свою прогулку. Она возвратилась в это утро опять к своему любимому состоянию любви к себе и восхищения перед собою. – «Что за прелесть эта Наташа!» сказала она опять про себя словами какого то третьего, собирательного, мужского лица. – «Хороша, голос, молода, и никому она не мешает, оставьте только ее в покое». Но сколько бы ни оставляли ее в покое, она уже не могла быть покойна и тотчас же почувствовала это.
В передней отворилась дверь подъезда, кто то спросил: дома ли? и послышались чьи то шаги. Наташа смотрелась в зеркало, но она не видала себя. Она слушала звуки в передней. Когда она увидала себя, лицо ее было бледно. Это был он. Она это верно знала, хотя чуть слышала звук его голоса из затворенных дверей.
Наташа, бледная и испуганная, вбежала в гостиную.
– Мама, Болконский приехал! – сказала она. – Мама, это ужасно, это несносно! – Я не хочу… мучиться! Что же мне делать?…
Еще графиня не успела ответить ей, как князь Андрей с тревожным и серьезным лицом вошел в гостиную. Как только он увидал Наташу, лицо его просияло. Он поцеловал руку графини и Наташи и сел подле дивана.
– Давно уже мы не имели удовольствия… – начала было графиня, но князь Андрей перебил ее, отвечая на ее вопрос и очевидно торопясь сказать то, что ему было нужно.
– Я не был у вас всё это время, потому что был у отца: мне нужно было переговорить с ним о весьма важном деле. Я вчера ночью только вернулся, – сказал он, взглянув на Наташу. – Мне нужно переговорить с вами, графиня, – прибавил он после минутного молчания.
Графиня, тяжело вздохнув, опустила глаза.
– Я к вашим услугам, – проговорила она.
Наташа знала, что ей надо уйти, но она не могла этого сделать: что то сжимало ей горло, и она неучтиво, прямо, открытыми глазами смотрела на князя Андрея.
«Сейчас? Сию минуту!… Нет, это не может быть!» думала она.
Он опять взглянул на нее, и этот взгляд убедил ее в том, что она не ошиблась. – Да, сейчас, сию минуту решалась ее судьба.
– Поди, Наташа, я позову тебя, – сказала графиня шопотом.
Наташа испуганными, умоляющими глазами взглянула на князя Андрея и на мать, и вышла.
– Я приехал, графиня, просить руки вашей дочери, – сказал князь Андрей. Лицо графини вспыхнуло, но она ничего не сказала.
– Ваше предложение… – степенно начала графиня. – Он молчал, глядя ей в глаза. – Ваше предложение… (она сконфузилась) нам приятно, и… я принимаю ваше предложение, я рада. И муж мой… я надеюсь… но от нее самой будет зависеть…
– Я скажу ей тогда, когда буду иметь ваше согласие… даете ли вы мне его? – сказал князь Андрей.
– Да, – сказала графиня и протянула ему руку и с смешанным чувством отчужденности и нежности прижалась губами к его лбу, когда он наклонился над ее рукой. Она желала любить его, как сына; но чувствовала, что он был чужой и страшный для нее человек. – Я уверена, что мой муж будет согласен, – сказала графиня, – но ваш батюшка…
– Мой отец, которому я сообщил свои планы, непременным условием согласия положил то, чтобы свадьба была не раньше года. И это то я хотел сообщить вам, – сказал князь Андрей.
– Правда, что Наташа еще молода, но так долго.
– Это не могло быть иначе, – со вздохом сказал князь Андрей.
– Я пошлю вам ее, – сказала графиня и вышла из комнаты.
– Господи, помилуй нас, – твердила она, отыскивая дочь. Соня сказала, что Наташа в спальне. Наташа сидела на своей кровати, бледная, с сухими глазами, смотрела на образа и, быстро крестясь, шептала что то. Увидав мать, она вскочила и бросилась к ней.
– Что? Мама?… Что?
– Поди, поди к нему. Он просит твоей руки, – сказала графиня холодно, как показалось Наташе… – Поди… поди, – проговорила мать с грустью и укоризной вслед убегавшей дочери, и тяжело вздохнула.
Наташа не помнила, как она вошла в гостиную. Войдя в дверь и увидав его, она остановилась. «Неужели этот чужой человек сделался теперь всё для меня?» спросила она себя и мгновенно ответила: «Да, всё: он один теперь дороже для меня всего на свете». Князь Андрей подошел к ней, опустив глаза.
– Я полюбил вас с той минуты, как увидал вас. Могу ли я надеяться?
Он взглянул на нее, и серьезная страстность выражения ее лица поразила его. Лицо ее говорило: «Зачем спрашивать? Зачем сомневаться в том, чего нельзя не знать? Зачем говорить, когда нельзя словами выразить того, что чувствуешь».
Она приблизилась к нему и остановилась. Он взял ее руку и поцеловал.
– Любите ли вы меня?
– Да, да, – как будто с досадой проговорила Наташа, громко вздохнула, другой раз, чаще и чаще, и зарыдала.
– Об чем? Что с вами?
– Ах, я так счастлива, – отвечала она, улыбнулась сквозь слезы, нагнулась ближе к нему, подумала секунду, как будто спрашивая себя, можно ли это, и поцеловала его.
Князь Андрей держал ее руки, смотрел ей в глаза, и не находил в своей душе прежней любви к ней. В душе его вдруг повернулось что то: не было прежней поэтической и таинственной прелести желания, а была жалость к ее женской и детской слабости, был страх перед ее преданностью и доверчивостью, тяжелое и вместе радостное сознание долга, навеки связавшего его с нею. Настоящее чувство, хотя и не было так светло и поэтично как прежнее, было серьезнее и сильнее.
– Сказала ли вам maman, что это не может быть раньше года? – сказал князь Андрей, продолжая глядеть в ее глаза. «Неужели это я, та девочка ребенок (все так говорили обо мне) думала Наташа, неужели я теперь с этой минуты жена , равная этого чужого, милого, умного человека, уважаемого даже отцом моим. Неужели это правда! неужели правда, что теперь уже нельзя шутить жизнию, теперь уж я большая, теперь уж лежит на мне ответственность за всякое мое дело и слово? Да, что он спросил у меня?»
– Нет, – отвечала она, но она не понимала того, что он спрашивал.
– Простите меня, – сказал князь Андрей, – но вы так молоды, а я уже так много испытал жизни. Мне страшно за вас. Вы не знаете себя.
Наташа с сосредоточенным вниманием слушала, стараясь понять смысл его слов и не понимала.
– Как ни тяжел мне будет этот год, отсрочивающий мое счастье, – продолжал князь Андрей, – в этот срок вы поверите себя. Я прошу вас через год сделать мое счастье; но вы свободны: помолвка наша останется тайной и, ежели вы убедились бы, что вы не любите меня, или полюбили бы… – сказал князь Андрей с неестественной улыбкой.
– Зачем вы это говорите? – перебила его Наташа. – Вы знаете, что с того самого дня, как вы в первый раз приехали в Отрадное, я полюбила вас, – сказала она, твердо уверенная, что она говорила правду.
– В год вы узнаете себя…
– Целый год! – вдруг сказала Наташа, теперь только поняв то, что свадьба отсрочена на год. – Да отчего ж год? Отчего ж год?… – Князь Андрей стал ей объяснять причины этой отсрочки. Наташа не слушала его.
– И нельзя иначе? – спросила она. Князь Андрей ничего не ответил, но в лице его выразилась невозможность изменить это решение.
– Это ужасно! Нет, это ужасно, ужасно! – вдруг заговорила Наташа и опять зарыдала. – Я умру, дожидаясь года: это нельзя, это ужасно. – Она взглянула в лицо своего жениха и увидала на нем выражение сострадания и недоумения.
– Нет, нет, я всё сделаю, – сказала она, вдруг остановив слезы, – я так счастлива! – Отец и мать вошли в комнату и благословили жениха и невесту.
С этого дня князь Андрей женихом стал ездить к Ростовым.


Обручения не было и никому не было объявлено о помолвке Болконского с Наташей; на этом настоял князь Андрей. Он говорил, что так как он причиной отсрочки, то он и должен нести всю тяжесть ее. Он говорил, что он навеки связал себя своим словом, но что он не хочет связывать Наташу и предоставляет ей полную свободу. Ежели она через полгода почувствует, что она не любит его, она будет в своем праве, ежели откажет ему. Само собою разумеется, что ни родители, ни Наташа не хотели слышать об этом; но князь Андрей настаивал на своем. Князь Андрей бывал каждый день у Ростовых, но не как жених обращался с Наташей: он говорил ей вы и целовал только ее руку. Между князем Андреем и Наташей после дня предложения установились совсем другие чем прежде, близкие, простые отношения. Они как будто до сих пор не знали друг друга. И он и она любили вспоминать о том, как они смотрели друг на друга, когда были еще ничем , теперь оба они чувствовали себя совсем другими существами: тогда притворными, теперь простыми и искренними. Сначала в семействе чувствовалась неловкость в обращении с князем Андреем; он казался человеком из чуждого мира, и Наташа долго приучала домашних к князю Андрею и с гордостью уверяла всех, что он только кажется таким особенным, а что он такой же, как и все, и что она его не боится и что никто не должен бояться его. После нескольких дней, в семействе к нему привыкли и не стесняясь вели при нем прежний образ жизни, в котором он принимал участие. Он про хозяйство умел говорить с графом и про наряды с графиней и Наташей, и про альбомы и канву с Соней. Иногда домашние Ростовы между собою и при князе Андрее удивлялись тому, как всё это случилось и как очевидны были предзнаменования этого: и приезд князя Андрея в Отрадное, и их приезд в Петербург, и сходство между Наташей и князем Андреем, которое заметила няня в первый приезд князя Андрея, и столкновение в 1805 м году между Андреем и Николаем, и еще много других предзнаменований того, что случилось, было замечено домашними.
В доме царствовала та поэтическая скука и молчаливость, которая всегда сопутствует присутствию жениха и невесты. Часто сидя вместе, все молчали. Иногда вставали и уходили, и жених с невестой, оставаясь одни, всё также молчали. Редко они говорили о будущей своей жизни. Князю Андрею страшно и совестно было говорить об этом. Наташа разделяла это чувство, как и все его чувства, которые она постоянно угадывала. Один раз Наташа стала расспрашивать про его сына. Князь Андрей покраснел, что с ним часто случалось теперь и что особенно любила Наташа, и сказал, что сын его не будет жить с ними.
– Отчего? – испуганно сказала Наташа.
– Я не могу отнять его у деда и потом…
– Как бы я его любила! – сказала Наташа, тотчас же угадав его мысль; но я знаю, вы хотите, чтобы не было предлогов обвинять вас и меня.
Старый граф иногда подходил к князю Андрею, целовал его, спрашивал у него совета на счет воспитания Пети или службы Николая. Старая графиня вздыхала, глядя на них. Соня боялась всякую минуту быть лишней и старалась находить предлоги оставлять их одних, когда им этого и не нужно было. Когда князь Андрей говорил (он очень хорошо рассказывал), Наташа с гордостью слушала его; когда она говорила, то со страхом и радостью замечала, что он внимательно и испытующе смотрит на нее. Она с недоумением спрашивала себя: «Что он ищет во мне? Чего то он добивается своим взглядом! Что, как нет во мне того, что он ищет этим взглядом?» Иногда она входила в свойственное ей безумно веселое расположение духа, и тогда она особенно любила слушать и смотреть, как князь Андрей смеялся. Он редко смеялся, но зато, когда он смеялся, то отдавался весь своему смеху, и всякий раз после этого смеха она чувствовала себя ближе к нему. Наташа была бы совершенно счастлива, ежели бы мысль о предстоящей и приближающейся разлуке не пугала ее, так как и он бледнел и холодел при одной мысли о том.
Накануне своего отъезда из Петербурга, князь Андрей привез с собой Пьера, со времени бала ни разу не бывшего у Ростовых. Пьер казался растерянным и смущенным. Он разговаривал с матерью. Наташа села с Соней у шахматного столика, приглашая этим к себе князя Андрея. Он подошел к ним.
– Вы ведь давно знаете Безухого? – спросил он. – Вы любите его?
– Да, он славный, но смешной очень.
И она, как всегда говоря о Пьере, стала рассказывать анекдоты о его рассеянности, анекдоты, которые даже выдумывали на него.
– Вы знаете, я поверил ему нашу тайну, – сказал князь Андрей. – Я знаю его с детства. Это золотое сердце. Я вас прошу, Натали, – сказал он вдруг серьезно; – я уеду, Бог знает, что может случиться. Вы можете разлю… Ну, знаю, что я не должен говорить об этом. Одно, – чтобы ни случилось с вами, когда меня не будет…
– Что ж случится?…
– Какое бы горе ни было, – продолжал князь Андрей, – я вас прошу, m lle Sophie, что бы ни случилось, обратитесь к нему одному за советом и помощью. Это самый рассеянный и смешной человек, но самое золотое сердце.
Ни отец и мать, ни Соня, ни сам князь Андрей не могли предвидеть того, как подействует на Наташу расставанье с ее женихом. Красная и взволнованная, с сухими глазами, она ходила этот день по дому, занимаясь самыми ничтожными делами, как будто не понимая того, что ожидает ее. Она не плакала и в ту минуту, как он, прощаясь, последний раз поцеловал ее руку. – Не уезжайте! – только проговорила она ему таким голосом, который заставил его задуматься о том, не нужно ли ему действительно остаться и который он долго помнил после этого. Когда он уехал, она тоже не плакала; но несколько дней она не плача сидела в своей комнате, не интересовалась ничем и только говорила иногда: – Ах, зачем он уехал!
Но через две недели после его отъезда, она так же неожиданно для окружающих ее, очнулась от своей нравственной болезни, стала такая же как прежде, но только с измененной нравственной физиогномией, как дети с другим лицом встают с постели после продолжительной болезни.


Здоровье и характер князя Николая Андреича Болконского, в этот последний год после отъезда сына, очень ослабели. Он сделался еще более раздражителен, чем прежде, и все вспышки его беспричинного гнева большей частью обрушивались на княжне Марье. Он как будто старательно изыскивал все больные места ее, чтобы как можно жесточе нравственно мучить ее. У княжны Марьи были две страсти и потому две радости: племянник Николушка и религия, и обе были любимыми темами нападений и насмешек князя. О чем бы ни заговорили, он сводил разговор на суеверия старых девок или на баловство и порчу детей. – «Тебе хочется его (Николеньку) сделать такой же старой девкой, как ты сама; напрасно: князю Андрею нужно сына, а не девку», говорил он. Или, обращаясь к mademoiselle Bourime, он спрашивал ее при княжне Марье, как ей нравятся наши попы и образа, и шутил…
Он беспрестанно больно оскорблял княжну Марью, но дочь даже не делала усилий над собой, чтобы прощать его. Разве мог он быть виноват перед нею, и разве мог отец ее, который, она всё таки знала это, любил ее, быть несправедливым? Да и что такое справедливость? Княжна никогда не думала об этом гордом слове: «справедливость». Все сложные законы человечества сосредоточивались для нее в одном простом и ясном законе – в законе любви и самоотвержения, преподанном нам Тем, Который с любовью страдал за человечество, когда сам он – Бог. Что ей было за дело до справедливости или несправедливости других людей? Ей надо было самой страдать и любить, и это она делала.
Зимой в Лысые Горы приезжал князь Андрей, был весел, кроток и нежен, каким его давно не видала княжна Марья. Она предчувствовала, что с ним что то случилось, но он не сказал ничего княжне Марье о своей любви. Перед отъездом князь Андрей долго беседовал о чем то с отцом и княжна Марья заметила, что перед отъездом оба были недовольны друг другом.
Вскоре после отъезда князя Андрея, княжна Марья писала из Лысых Гор в Петербург своему другу Жюли Карагиной, которую княжна Марья мечтала, как мечтают всегда девушки, выдать за своего брата, и которая в это время была в трауре по случаю смерти своего брата, убитого в Турции.
«Горести, видно, общий удел наш, милый и нежный друг Julieie».
«Ваша потеря так ужасна, что я иначе не могу себе объяснить ее, как особенную милость Бога, Который хочет испытать – любя вас – вас и вашу превосходную мать. Ах, мой друг, религия, и только одна религия, может нас, уже не говорю утешить, но избавить от отчаяния; одна религия может объяснить нам то, чего без ее помощи не может понять человек: для чего, зачем существа добрые, возвышенные, умеющие находить счастие в жизни, никому не только не вредящие, но необходимые для счастия других – призываются к Богу, а остаются жить злые, бесполезные, вредные, или такие, которые в тягость себе и другим. Первая смерть, которую я видела и которую никогда не забуду – смерть моей милой невестки, произвела на меня такое впечатление. Точно так же как вы спрашиваете судьбу, для чего было умирать вашему прекрасному брату, точно так же спрашивала я, для чего было умирать этому ангелу Лизе, которая не только не сделала какого нибудь зла человеку, но никогда кроме добрых мыслей не имела в своей душе. И что ж, мой друг, вот прошло с тех пор пять лет, и я, с своим ничтожным умом, уже начинаю ясно понимать, для чего ей нужно было умереть, и каким образом эта смерть была только выражением бесконечной благости Творца, все действия Которого, хотя мы их большею частью не понимаем, суть только проявления Его бесконечной любви к Своему творению. Может быть, я часто думаю, она была слишком ангельски невинна для того, чтобы иметь силу перенести все обязанности матери. Она была безупречна, как молодая жена; может быть, она не могла бы быть такою матерью. Теперь, мало того, что она оставила нам, и в особенности князю Андрею, самое чистое сожаление и воспоминание, она там вероятно получит то место, которого я не смею надеяться для себя. Но, не говоря уже о ней одной, эта ранняя и страшная смерть имела самое благотворное влияние, несмотря на всю печаль, на меня и на брата. Тогда, в минуту потери, эти мысли не могли притти мне; тогда я с ужасом отогнала бы их, но теперь это так ясно и несомненно. Пишу всё это вам, мой друг, только для того, чтобы убедить вас в евангельской истине, сделавшейся для меня жизненным правилом: ни один волос с головы не упадет без Его воли. А воля Его руководствуется только одною беспредельною любовью к нам, и потому всё, что ни случается с нами, всё для нашего блага. Вы спрашиваете, проведем ли мы следующую зиму в Москве? Несмотря на всё желание вас видеть, не думаю и не желаю этого. И вы удивитесь, что причиною тому Буонапарте. И вот почему: здоровье отца моего заметно слабеет: он не может переносить противоречий и делается раздражителен. Раздражительность эта, как вы знаете, обращена преимущественно на политические дела. Он не может перенести мысли о том, что Буонапарте ведет дело как с равными, со всеми государями Европы и в особенности с нашим, внуком Великой Екатерины! Как вы знаете, я совершенно равнодушна к политическим делам, но из слов моего отца и разговоров его с Михаилом Ивановичем, я знаю всё, что делается в мире, и в особенности все почести, воздаваемые Буонапарте, которого, как кажется, еще только в Лысых Горах на всем земном шаре не признают ни великим человеком, ни еще менее французским императором. И мой отец не может переносить этого. Мне кажется, что мой отец, преимущественно вследствие своего взгляда на политические дела и предвидя столкновения, которые у него будут, вследствие его манеры, не стесняясь ни с кем, высказывать свои мнения, неохотно говорит о поездке в Москву. Всё, что он выиграет от лечения, он потеряет вследствие споров о Буонапарте, которые неминуемы. Во всяком случае это решится очень скоро. Семейная жизнь наша идет по старому, за исключением присутствия брата Андрея. Он, как я уже писала вам, очень изменился последнее время. После его горя, он теперь только, в нынешнем году, совершенно нравственно ожил. Он стал таким, каким я его знала ребенком: добрым, нежным, с тем золотым сердцем, которому я не знаю равного. Он понял, как мне кажется, что жизнь для него не кончена. Но вместе с этой нравственной переменой, он физически очень ослабел. Он стал худее чем прежде, нервнее. Я боюсь за него и рада, что он предпринял эту поездку за границу, которую доктора уже давно предписывали ему. Я надеюсь, что это поправит его. Вы мне пишете, что в Петербурге о нем говорят, как об одном из самых деятельных, образованных и умных молодых людей. Простите за самолюбие родства – я никогда в этом не сомневалась. Нельзя счесть добро, которое он здесь сделал всем, начиная с своих мужиков и до дворян. Приехав в Петербург, он взял только то, что ему следовало. Удивляюсь, каким образом вообще доходят слухи из Петербурга в Москву и особенно такие неверные, как тот, о котором вы мне пишете, – слух о мнимой женитьбе брата на маленькой Ростовой. Я не думаю, чтобы Андрей когда нибудь женился на ком бы то ни было и в особенности на ней. И вот почему: во первых я знаю, что хотя он и редко говорит о покойной жене, но печаль этой потери слишком глубоко вкоренилась в его сердце, чтобы когда нибудь он решился дать ей преемницу и мачеху нашему маленькому ангелу. Во вторых потому, что, сколько я знаю, эта девушка не из того разряда женщин, которые могут нравиться князю Андрею. Не думаю, чтобы князь Андрей выбрал ее своею женою, и откровенно скажу: я не желаю этого. Но я заболталась, кончаю свой второй листок. Прощайте, мой милый друг; да сохранит вас Бог под Своим святым и могучим покровом. Моя милая подруга, mademoiselle Bourienne, целует вас.