And*_*mes 2 bash terminal sed .bash-profile
我首先会说我不确定这应该在这里还是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!"
}
Run Code Online (Sandbox Code Playgroud)
用法就像 bootlaravel LaravelProjectName
在使用sed命令修改.env文件的地方,它实际上是创建一个.env-e文件作为现有.env文件的兄弟.我实际上无法理解为什么会这样做.它虽然改变了所需的单词.
任何帮助表示赞赏
我通常建议不要使用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
Run Code Online (Sandbox Code Playgroud)
在我看来,使用临时文件是支付便携性和稳健性的一个小代价.
另外,引用所有用户提供的字符串.在你的情况,$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!"
}
Run Code Online (Sandbox Code Playgroud)
这也使用小写$project(通常用于环境变量的大写),并且如果任何cd失败,将返回非零状态.我还在project函数中声明为一个局部变量,以便不用新的shell变量污染调用shell.空行等主要是为了便于阅读.