我首先要说的是我不确定这应该在这里还是SuperUser,所以如果我需要删除,请告诉我。
我在~./bash_profile
内创建了一个功能,以便在我启动新的Laravel项目时帮助我。这是脚本:
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!"
}
用法类似于bootlaravel LaravelProjectName
在使用sed
命令修改.env
文件的情况下,它实际上创建了一个.env-e
文件作为现有.env
文件的兄弟。我无法理解为什么要这样做。它虽然改变了所需要的字样。
感谢任何帮助
答案 0 :(得分:6)
我通常建议不要使用sed -i
,特别是在尝试解决问题或在平台之间移动脚本时。 BSD sed
(例如在OS X上)需要 -i
的参数,这也可能是您在文件上得到-e
后缀的原因(并且肯定是为什么-ie
会为您提供e
后缀,即使使用GNU sed
也是如此。
您可以合并sed
的三次调用:
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
在我看来,使用临时文件是支付便携性和稳健性的一个小代价。
此外,引用所有用户提供的字符串。在你的情况下,$PROJECT
和$1
,例如,你有一个很好的SQL注入可能性。
如果我正确引用了SQL,那么这将是修改后的shell函数:
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!"
}
这也使用小写$project
(通常用于环境变量的大写),如果任何cd
失败,将返回非零状态。我还将project
声明为函数中的局部变量,以便不使用新的shell变量污染调用shell。空行等主要是为了便于阅读。