Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 11: Функции Вперед

Примеры функций в скриптах

Повторное использование кода

В вашей системе довольно много скриптов, в которых функции используются для структурной обработки последовательностей команд. Например, в некоторых системах Linux вы можете найти файл определений /etc/rc.d/init.d/functions, в котором приведены все скрипты init. Если использовать такой подход, то обычно выполняемые задачи, например, проверки, работает ли процесс, запущены ли или остановлены демоны и т. д., должны быть написаны только один раз в обобщенном виде. Если та же самая задача требуется снова, то код используется повторно.

Вы можете создать свой собственный вариант файла /etc/functions, где будут находиться функции, которые, в отличие от скриптов, будут регулярно использоваться в вашей системе. Просто поместите строку

. /etc/functions 

где-нибудь в начале скрипта и вы сможете повторно использовать функции.

Настройка пути

Пример из этого раздела можно найти в файле /etc/profile. Определяется функция pathmunge, затем она применяется для настройки путей для пользователя root и других пользователей:

pathmunge () {
        if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

# Path manipulation
if [ `id -u` = 0 ]; then
        pathmunge /sbin
        pathmunge /usr/sbin
        pathmunge /usr/local/sbin
fi

pathmunge /usr/X11R6/bin after

unset pathmunge

Функция использует свой первый аргумент в качестве имени пути. Если этот путь еще не является текущий путем, он будет добавлен. Второй аргумент функции определяет, будет ли этот путь добавлен перед или после текущего определения PATH.

Для обычных пользователей к их путям добавляется только /usr/X11R6/bin, а для пользователя root добавляется несколько дополнительных директориев, содержащих системные команды. После того, как функция будет использована, для нее нужно указать операцию unset, чтобы она не сохранялась.

Удаленное резервное копирование

Следующий пример является одним их тех, которым я пользуюсь при создании резервных копий файлов моих книг. В нем при создании удаленного соединения применяются ключи SSH. Определены две функции buplinux и bupbash, с помощью которых создается файл .tar, который затем сжимается и отправляется на удаленный сервер. После этого, локальная копия стирается.

В воскресенье выполняется только функция bupbash.

#/bin/bash

LOGFILE="/nethome/tille/log/backupscript.log"
echo "Starting backups for `date`" >> "$LOGFILE"

buplinux()
{
DIR="/nethome/tille/xml/db/linux-basics/"
TAR="Linux.tar"
BZIP="$TAR.bz2"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"

cd "$DIR"
tar cf "$TAR" src/*.xml src/images/*.png src/images/*.eps
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"
echo -e "Done backing up Linux course:\nSource files, PNG and EPS images.\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}

bupbash()
{
DIR="/nethome/tille/xml/db/"
TAR="Bash.tar"
BZIP="$TAR.bz2"
FILES="bash-programming/"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"

cd "$DIR"
tar cf "$TAR" "$FILES"
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"

echo -e "Done backing up Bash course:\n$FILES\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}

DAY=`date +%w`

if [ "$DAY" -lt "2" ]; then
  echo "It is `date +%A`, only backing up Bash course." >> "$LOGFILE"
  bupbash
else
  buplinux
  bupbash
fi


echo -e "Remote backup `date` SUCCESS\n----------" >> "$LOGFILE"

Этот скрипт работает из cron, то есть без вмешательства пользователя, поэтому мы с помощью команды scp перенаправляем стандартный поток ошибок в /dev/null.

Очевидно, что все шаги, выполняемые по отдельности, можно объединить в одну команду следующим образом

tar c dir_to_backup/ | bzip2 | ssh server "cat > backup.tar.bz2" 

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

Выражение

command &> file 

эквивалентно выражению

command > file 2>&1

Предыдущий раздел: Оглавление Следующий раздел:
Введение   Подводим итог главы 11