2016-04-22 2 views
1

Я написал сценарий установки для чего-то, и теперь мне нужно создать виртуальный хост с ним. Для этого я использовал этот код:

echo -e \ 
"WSGISocketPrefix $DIRECTORY/socks/\n"\ 
"WSGIPythonHome $DIRECTORY/env/local\n"\ 
"WSGIRestrictStdout On\n"\ 
"WSGIRestrictSignal Off\n"\ 
"WSGIPythonOptimize 1\n"\ 
"<VirtualHost *:80>\n"\ 
" ServerAdmin [email protected]\n"\ 
" ServerName app.localhost\n"\ 
" DocumentRoot \"$DIRECTORY\"\n"\ 
" Alias /m/ $DIRECTORY/static/\n"\ 
" Alias /upfiles/ $DIRECTORY/askbot/upfiles/\n"\ 
" <DirectoryMatch \"$DIRECTORY/askbot/skins/([^/]+)/media\">\n"\ 
"  Order deny,allow\n"\ 
"  Allow from all\n"\ 
" </DirectoryMatch>\n"\ 
" <Directory \"$DIRECTORY/askbot/upfiles\">\n"\ 
"  Order deny,allow\n"\ 
"  Allow from all\n"\ 
" </Directory>\n"\ 
"\n"\ 
" WSGIDaemonProcess askbot_"$NUMBER"_\n"\ 
" WSGIProcessGroup askbot_"$NUMBER"_\n"\ 
" WSGIScriptAlias/$DIRECTORY/django.wsgi\n"\ 
"\n"\  
' ErrorLog ${APACHE_LOG_DIR}/askbot_error.log'"\n"\ 
' CustomLog ${APACHE_LOG_DIR}/askbot_access.log combined'"\n"\ 
"</VirtualHost>\n" > /etc/apache2/sites-available/app.conf 

$DIRECTORY является переменным, содержащим путем и, следовательно, его содержание должно быть напечатано. ${APACHE_LOG_DIR}, однако, здесь нет переменной, и она должна быть напечатана как есть. К сожалению, вместо того, чтобы записывать содержимое в файл, он будет отсылать его на терминал с некоторыми ошибками (файл не найден и т. Д.). Когда я удаляю последние две строки, это работает, но, конечно, это не решение, но я не могу заставить его работать.

Любые идеи?

+0

Взгляните: [здесь документ] (https://en.wikipedia.org/wiki/Here_document) – Cyrus

ответ

2

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

cat <<EOF > /etc/apache2/sites-available/app.conf 
WSGISocketPrefix $DIRECTORY/socks/ 
WSGIPythonHome $DIRECTORY/env/local 
WSGIRestrictStdout On 
WSGIRestrictSignal Off 
WSGIPythonOptimize 1 
<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName app.localhost 
    DocumentRoot "$DIRECTORY" 
    Alias /m/ $DIRECTORY/static/ 
    Alias /upfiles/ $DIRECTORY/askbot/upfiles/ 
    <DirectoryMatch "$DIRECTORY/askbot/skins/([^/]+)/media"> 
     Order deny,allow 
     Allow from all 
    </DirectoryMatch> 
    <Directory "$DIRECTORY/askbot/upfiles"> 
     Order deny,allow 
     Allow from all 
    </Directory> 

    WSGIDaemonProcess askbot_$NUMBER_ 
    WSGIProcessGroup askbot_$NUMBER_ 
    WSGIScriptAlias/$DIRECTORY/django.wsgi 

    ErrorLog \${APACHE_LOG_DIR}/askbot_error.log 
    CustomLog \${APACHE_LOG_DIR}/askbot_access.log combined 
</VirtualHost> 
EOF 
+0

Спасибо, это так. Не знал, что bash может использовать это :) – Hering

2

echo понимает многострочные строки:

echo " 
fist section here with ${substitutions} 


" > /etc/apache2/sites-available/app.conf 

затем добавить последний раздел:

echo ' 
second section here without substitutions 
' >> /etc/apache2/sites-available/app.conf 

, но в данном случае это может быть проще создать файл шаблона, а затем использовать, например, sed выполнять строковые замены? Я использую интерфейс командной строки для Jinja2 для выполнения той же задачи (https://github.com/kolypto/j2cli), но это почти наверняка излишним для такого простого шаблона ;-)