Отсюда: http://blog.eqlbin.ru/2010/12/deploy-bash.html
Одним из интересных свойств bash-скриптов является то, что в них можно запихивать файлы, которые затем сам скрипт будет из себя извлекать при запуске. Таким образом, например, устроены скрипты установки JRE и JDK для Linux. Используя это свойство, можно довольно легко создавать скрипты для автоматизированного развертывания каких-либо систем, библиотек и т.п.. Приведу примеры извлечения текстовых и бинарных данных из bash-скриптов.
Используя команду cat, из выполняющегося скрипта можно вытащить любые данные, которые находятся между вызовом cat и какой-либо текстовой меткой. Это удобно использовать в первую очередь для извлечения текстовых данных, например скриптов. Т.е. можно создавать bash-скрипты, которые при выполнении сами будут создавать различные скрипты, причем используя переменные можно добиться хорошей гибкости.
Простой пример скрипта создающего другие скрипты:
#!/bin/bash
# Каталог для развертывания
DEPLOY_PATH="./scripts/inner-scripts"
# Имя первого вложенного скрипта
FIRST_SCRIPT_NAME="script-inner-1.sh"
# Имя второго вложенного скрипта
SECOND_SCRIPT_NAME="script-inner-2.sh"
echo "Развертывание вложенных скриптов"
# Создание каталога для развертывания если его нет
if [ ! -d $DEPLOY_PATH ]
then
echo "Создание каталога $DEPLOY_PATH"
mkdir -p $DEPLOY_PATH
fi
cd $DEPLOY_PATH
echo "Создание скрипта $FIRST_SCRIPT_NAME"
# Извлечение текста между вызовом cat и первой меткой _EOF_
cat > ./$FIRST_SCRIPT_NAME << _EOF_
#!/bin/bash
# первый вложенный скрипт
echo "Первый скрипт запущен!"
echo "Запуск второго скрипта..."
./$SECOND_SCRIPT_NAME
_EOF_
echo "Создание скрипта $SECOND_SCRIPT_NAME"
# Извлечение текста между вызовом cat и второй меткой _EOF_
cat > ./$SECOND_SCRIPT_NAME << _EOF_
#!/bin/bash
# второй вложенный скрипт
echo "Второй скрипт запущен!"
_EOF_
# Установка прав на выполнение скриптов
chmod 755 $FIRST_SCRIPT_NAME $SECOND_SCRIPT_NAME
echo "Развертывание скриптов закончено!"
Приведенный код создаст два скрипта, причем первый скрипт будет запускать второй скрипт при выполнении.
Помимо текстовых данных из скрипта можно извлекать предварительно записанные в них бинарные файлы, например архивы. Особенность при создании такого скрипта в том, что сначала надо написать сам скрипт, а потом с помощью команды cat загнать в него необходимый файл. \\Пример скрипта, который извлекает из себя архив с jar-файлами, распаковывает его и удаляет архив:
#!/bin/bash
DEPLOY_PATH="./libs/jar/odfdom-simple"
ARCH_NAME="odfdom-libs.tar.gz"
echo "Развертывание библиотек ODFDOM"
# Создание каталога если его нет
if [ ! -d $DEPLOY_PATH ]
then
echo "Создание каталога $DEPLOY_PATH"
mkdir -p $DEPLOY_PATH
fi
echo "Создание скрипта $FIRST_SCRIPT_NAME"
# Вытаскиваем архив из скрипта (начиная с 30-й строки до конца скрипта)
tail -n +30 "$0" > $DEPLOY_PATH/$ARCH_NAME
cd $DEPLOY_PATH
# Распаковка архива
tar xzf $ARCH_NAME
# Удаление архива
rm -f $ARCH_NAME
# Выход из программы с кодом 0
exit 0
##################################################################
# 30-я строка; здесь начнутся бинарные данные; эту строку включать в скрипт не надо
После того, как будет написана последовательность команд скрипта, необходимо в конце вставить пустую строку, сохранить скрипт и выполнить в терминале нечто вроде:
cat my_arch.tar.gz >> my_script.sh
После выполнения этой команды архив my_arch.tar.gz станет частью скрипта my_script.sh. Для извлечения архива в приведенном примере используется команда tail -n +30 «$0» > $DEPLOY_PATH/$ARCH_NAME, которая в данном случае извлекает бинарные данные и перенаправляет вывод в файл ./libs/jar/odfdom-simple/odfdom-libs.tar.gz. Параметр -n +30 означает, что выводить данные надо начиная с 30 строки файла, а под «$0» скрывается имя выполняющегося скрипта.
После того как данные извлечены, можно распаковывать архив, распихивать файлы по каталогам, создавать симлинки и в общем делать всё, что нужно для развертывания вашей системы. Самое главное не забудьте вызвать команду exit до того, как начнутся бинарные данные, иначе bash попытается выполнить и их :)