# mkdir /image
# modprobe usb_storage
# mount /dev/sda1 /image
Теперь на новом винчестере нужно создать разделы. Это можно сделать с помощью утилиты fdisk или с помощью программы установки — как вам удобнее. Если же вы восстанавливаете систему после сбоя, ничего создавать не нужно — все уже создано. Не забудьте только создать раздел подкачки (тип раздела /dev/hda2 должен быть Linux swap):
# mkswap /dev/hda2
Теперь развернем образ (обратите внимание на параметры if и of программы dd — на этот раз их аргументы поменялись местами):
# dd if=/image/image.bin of=/dev/hda1
Сейчас нам нужно изменить корневую файловую систему, чтобы попасть «внутрь» развернутого образа:
# mkdir /install
# mount /dev/hda1 /install
# chroot /install /bin/bash
Теперь корнем стал каталог /install, к которому примонтирован новый винчестер, а в качестве командной оболочки используется /bin/bash. Все, что нам осталось сделать — это перезаписать загрузчик. Если у вас LILO, введите команду:
# lilо
А если GRUB:
# grub-install /dev/hda
Теперь перезагрузите компьютер (reboot) — ваша система успешно восстановлена после клонирования.
Глава 8
Язык командного интерпретатора
Для автоматизации часто выполняемых работ по обслуживанию системы вам понадобится объединять команды в сценарии. С простейшими сценариями, обеспечивающими последовательное выполнение перечисленных команд, вы уже познакомились в гл. 3. Уточню только, как система обрабатывает сценарии. Она ищет в первой строке файла сценария выражение
#!/абсолютный/путь/к/программе/интерпретатору/сценария
и передает сценарий ей на обработку. Как правило, эта программа — либо одна из установленных в системе оболочек (например, #!/bin/tcsh), либо один из интерпретирующих языков (#!/usr/bin/perl), либо ваш собственный интерпретатор: #!/usr/bin/my_program. Если сценарий предназначен для обработки оболочкой sh, то ее имя указывать необязательно. Между символами # и ! не должно быть пробелов.
Чтобы непосредственно запустить файл сценария на выполнение, вы должны иметь полномочия на исполнение этого файла. Если он доступен вам только для чтения, выполнить его можно командой
$ /программа/обработчик -f <имя_файла>
Эта глава посвящена языку программирования, встроенному в оболочку bash.
Базовыми операциями этого языка служат все установленные в системе программы, утилиты и сценарии. Оболочка находит их, запускает, обеспечивает передачу им — аргументов, а результатов их работы — другим программам и пользователю, выполняет подстановку переменных и раскрытие шаблонов. Кроме того, оболочка содержит операторы цикла и условные операторы, в результате чего получается мощный язык программирования.
Вместо переменных, как и обычных языках программирования, в bash используется понятие параметра. Именем параметра может быть: слово, состоящее из латинских букв, цифр и знаков подчеркивания, начинающееся с буквы; число; один из специальных символов; *, #, ?, $, !, 0, _.
Тип всех параметров — строковый. Если параметру присвоено значение (хотя бы пустая строка), то говорят, что он задан или установлен. Чтобы сослаться на значение параметра, нужно поставить символ $ перед его именем:
$ echo $0
bash
Параметры делятся на:
♦ переменные оболочки — о них рассказано в п. 3.4.3;
♦ позиционные параметры — их имена представляют собой натуральное число, а значениями служат аргументы с соответствующими номерами, начиная с 1, переданные сценарию или самой оболочке при их запуске;
♦ специальные параметры — их именами служат перечисленные специальные символы, а назначение сведено в таблицу 8.1. Эти параметры — шаблоны, подстановку которых производит оболочка.
Специальные переменные Таблица 8.1
Название Подстановка $0 Имя выполняемого сценария (или, в интерактивном режиме, — самой оболочки) $# Количество позиционных параметров, переданных сценарию $_ Последний аргумент предыдущей из выполнявшихся команд $? Код завершения последней выполненной команды (напоминаю, что значение 0 говорит об успешном завершении, другое — об ошибочном) $$ Номер текущего процесса (PID) $! Номер (PID) последнего асинхронного процесса (команды, выполненной в фоновом режиме) $* Все позиционные параметры, слитые в одну строку: «$*» эквивалентно «$1x$2x…,$n», где x — первый символ значения переменной IFS (internal field separator), по умолчанию — пробел [email protected] Все позиционные параметры, подлежащие дальнейшему разбору: « [email protected]» эквивалентно «$1» «$2» ... «$n»
Напоминаю, что специальные символы в значениях параметров нужно экранировать. Экранировать одиночный символ можно символом «» (обратный слэш), несколько — апострофами или двойными кавычками. Разница в том, что внутри двойных кавычек выполняются подстановки значений: сравните вывод команд echo '$0' и echo "$0".
Организовать диалоговый ввод значения переменной можно с помощью встроенной команды read:
echo -n "Продолжать? (y/n): "
read yesno
echo $yesno
Ключ -n команды echo не выводит символ новой строки в конце сообщения, то есть не переводит строку. Команда read читает значение, введённое пользователем с клавиатуры, и записывает его в переменную yesno. Последняя команда выводит только что введенное значение.
Одной командой read можно прочитать несколько переменных:
read name middle lastname
Пользователь должен ввести значения переменных, разделяя их пробелами, и для окончания ввода нажать <Ввод>. Если введено меньше значений, чем нужно, оставшимся переменным будет присвоена пустая строка. Если больше, то весь остаток строки будет присвоен последней из перечисленных переменных.
Кроме подстановки обычных переменных (п.3.4.4) и раскрытия шаблонов имен файлов (п.3.4.5), оболочка bash умеет выполнять еще и такие подстановки:
♦ Подстановка тильды:
~ заменяется на имя домашнего каталога пользователя, запустившего сценарий;
~+ заменяется на путь к текущему каталогу;
~- заменяется на путь к предыдущему каталогу.
♦ Раскрытие скобок:
строка1{строка2,строка3...}строкаN заменяется на: строка1строка2строкаN строка1строка3строкаN ...
Пробелов внутри скобок быть не должно. Эта функция полезна, когда нужно применить одну команду к нескольким файлам, не подходящим под общий шаблон:
$ cat /home/den/linuxbook/{intro,param,subst} > glava8
♦ Подстановка арифметических выражений:
$((выражение)) или $[выражение] — эквивалентные формы записи. Внутри выражения выполняются подстановки параметров. Приоритет арифметических операций — обычный, подробнее см. man bash, секция ARITHMETIC EVALUATION.
Например, количество часов, прошедшее с момента запуски оболочки, можно подсчитать командой:
$ echo $(( $SECONDS/3600 ))
Интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. В других оболочках существуют определенные ограничения на массивы, например, в ksh максимальное число элементов массива ограничено 1024 элементами.
Нумерация элементов начинается с нуля. Тип элементов массива, как и тип параметров, строковый. Присвоить значение элементу массива можно с помощью такой конструкции:
Имя_массива[индекс] = значение, например:
$ weekday[0]=Понедельник
$ weekday[4]=Пятница
Обратиться к значению элемента массива можно следующим образом:
${имя_массива[индекс]}
Например, вывести значение первого элемента массива можно так:
$ echo ${weekday[0]}
Обратиться ко всем элементам массива сразу можно с помощью одного из выражений:
${имя_массива[*]} или ${имя_массива[@]}, например:
$echo ${weekday[*]}
Понедельник Пятница
Второе выражение нужно использовать, если значение хотя бы одного элемента массива может содержать пробелы.