2016-07-29 3 views
2

Ich werde zuerst sagen, dass ich nicht sicher bin, ob dies hier oder SuperUser sein sollte, also lassen Sie mich wissen, wenn ich entfernen muss.Warum erstellt dieses Skript eine doppelte Datei und fügt `-e` hinzu?

Ich mache eine Funktion innerhalb ~./bash_profile, um mir zu helfen, wenn ich neue Laravel-Projekte starte. Hier ist das Skript:

function bootlaravel { 
PROJECT=$1 
echo "Magically creating a new Laravel project: $PROJECT..." 
cd /Applications/MAMP/htdocs 
laravel new $PROJECT 
cd $PROJECT 
git init 
git add . 
git commit -m "Install Laravel" 
sed -i -e "s/DB_DATABASE=homestead/DB_DATABASE=$PROJECT/g" .env 
sed -i -e "s/DB_USERNAME=homestead/DB_USERNAME=root/g" .env 
sed -i -e "s/DB_PASSWORD=secret/DB_PASSWORD=/g" .env 
/Applications/MAMP/Library/bin/mysql --host=localhost -uroot -proot -e "create database $PROJECT DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci" 
open "http://$PROJECT.dev" 
pstorm . 
echo "Project: $PROJECT has been created. Have fun!" 
} 

Verbrauch ist so etwas wie bootlaravel LaravelProjectName

Wo die sed Befehle verwendet werden, um die .env-Datei zu ändern, es ist eigentlich eine .env-e Datei als Geschwister zu der bestehenden .env Datei. Ich kann nicht wirklich verstehen, warum es so ist. Es ändert die Wörter jedoch wie gewünscht.

Jede Hilfe ist

geschätzt
+0

Dies ist eine Aufnahme im Dunkeln, aber versuchen Sie 'sed -ie' statt' sed -i -e'? Da "-i" die Erweiterung ändert und "-e" hinzugefügt wird, vermute ich, dass das Problem besteht. –

+0

@CormacO'Brien fast, jetzt heißt es '.enve' haha ​​ –

+0

Wollen Sie Backups? Das ist die Idee mit 'sed -i', und die Flagge erfordert eine Erweiterung von nicht-Null Länge. Wenn nicht, einfach die '-i'-Flagge fallen lassen, ansonsten geben Sie eine Erweiterung wie '.bak'. –

Antwort

6

ich gegen allgemein beraten sed -i überhaupt mit, vor allem, wenn die Dinge aus oder bewegen Skripte zwischen Plattformen versuchen. Die BSD sed (unter OS X zum Beispiel) erfordert ein Argument -i, und das ist wahrscheinlich auch, warum Sie einen -e Suffix auf die Dateien erhalten (und definitiv warum -ie gibt Ihnen einen e Suffix, auch mit GNU sed) .

Ihre drei Anrufungen von sed kombiniert werden können:

sed -e 's/DB_DATABASE=homestead/DB_DATABASE='"$PROJECT"'/g' \ 
    -e 's/DB_USERNAME=homestead/DB_USERNAME=root/g' \ 
    -e 's/DB_PASSWORD=secret/DB_PASSWORD=/g' .env >.env-new && 
mv -f .env-new .env 

In meinem Kopf, eine temporäre Datei ist ein kleiner Preis für die Portabilität und Robustheit zu zahlen.

Geben Sie außerdem alle vom Benutzer angegebenen Strings an. In Ihrem Fall, $PROJECT und $1, haben Sie sonst eine schöne SQL-Injektionsmöglichkeit dort, zum Beispiel.

Wenn ich das SQL zitierte richtig verstanden habe, würde dies die modifizierte Shell-Funktion sein:

function bootlaravel { 
    local project="$1" 

    echo "Magically creating a new Laravel project: $project..." 

    cd /Applications/MAMP/htdocs || return 1  
    laravel new "$project" 
    cd "$project" || return 1 

    git init 
    git add . 
    git commit -m "Install Laravel" 

    sed -e 's/DB_DATABASE=homestead/DB_DATABASE='"$project"'/g' \ 
     -e 's/DB_USERNAME=homestead/DB_USERNAME=root/g' \ 
     -e 's/DB_PASSWORD=secret/DB_PASSWORD=/g' .env >.env-new && 
    mv -f .env-new .env 

    /Applications/MAMP/Library/bin/mysql \ 
     --host=localhost -uroot -proot <<SQL_END 
CREATE DATABASE \`$project\` 
DEFAULT CHARACTER SET utf8 
DEFAULT COLLATE utf8_general_ci 
SQL_END 

    open "http://$project.dev" 
    pstorm . 

    echo "Project: $project has been created. Have fun!" 
} 

Dies auch eine Klein $project (Groß- im Allgemeinen für Umgebungsvariablen verwendet wird) verwendet, und einen Nicht-Null-Status zurückkehren wenn einer der cd fehlschlägt. Ich erkläre auch project als eine lokale Variable in der Funktion, um die aufrufende Shell nicht mit neuen Shell-Variablen zu verschmutzen. Die leeren Zeilen usw. dienen hauptsächlich der Lesbarkeit.

+0

Nur nach Hause gehen, werde dies versuchen, sobald ich wieder bin –

+2

Um Überraschungen zu vermeiden, immer Skripte mit einfachen Anführungszeichen, nicht doppelt, und brechen Sie einfach bei Bedarf, z.'s/DB_DATABASE = homestead/DB_DATABASE = '" $ PROJECT "'/g'' und benutze immer' && 'zwischen' cmd file> tmp' und 'mv tmp file', damit du deine Originaldatei nicht auf a zappen musst Fehler. –

+1

@EdMorton Ihr Götter! Es tut uns leid! Danke, dass du das gesehen hast. – Kusalananda

Verwandte Themen