Библиотека сайта rus-linux.net
Руководство по 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 |