2016-04-22 15 views
1

Ich schrieb ein Setup-Skript für etwas und jetzt muss ich einen virtuellen Host damit erstellen. Um dies zu tun habe ich diesen Code:

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 ist eine Variable den Pfad enthält, und daher sollte ihr Inhalt gedruckt werden. ${APACHE_LOG_DIR} ist jedoch keine Variable hier und sollte so gedruckt werden, wie es ist. Leider, anstatt den Inhalt in die Datei zu schreiben, wird es mit einigen Fehlern auf dem Terminal wiedergegeben (Datei nicht gefunden usw.). Wenn ich die letzten zwei Zeilen entferne, funktioniert es, aber das ist natürlich keine Lösung, aber ich kann es nicht funktionieren.

Irgendwelche Ideen?

+0

Schauen Sie sich auf: [hier Dokument] (https://en.wikipedia.org/wiki/Here_document) – Cyrus

Antwort

2

Verwenden Sie ein Here-Dokument. Verwenden Sie \, um den Dollarzeichen zu entkommen, wo sie gebraucht werden.

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

Danke, das ist es. Ich wusste nicht, Bash kann das verwenden :) – Hering

2

echo versteht mehrzeilige Strings:

echo " 
fist section here with ${substitutions} 


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

dann den letzten Abschnitt anhängen:

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

aber in diesem Fall könnte es einfacher sein, eine Template-Datei zu erstellen und verwenden Sie dann z.B. sed String-Substitutionen zu tun? Ich benutze die Kommandozeilen-Schnittstelle zu Jinja2, um die gleiche Aufgabe zu erledigen (https://github.com/kolypto/j2cli), aber das ist mit ziemlicher Sicherheit ein Overkill für solch eine einfache Vorlage ;-)