为什么这个脚本会创建一个重复文件并在末尾添加“-e”?

Why is this script creating a duplicate file and adding `-e` to the end?

我首先要说的是,我不确定它应该在这里还是超级用户,所以如果我需要删除请告诉我。

我正在 ~./bash_profile 中创建一个函数来帮助我启动新的 Laravel 项目。这是脚本:

function bootlaravel {
PROJECT=
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 文件的同级文件。我真的不明白为什么要这样做。不过,它会根据需要更改单词。

感谢任何帮助

我通常建议完全不要使用 sed -i,尤其是在尝试或在平台之间移动脚本时。 BSD sed(例如在 OS X 上) 需要 一个 -i 的参数,这可能也是你得到 [=15] 的原因=] 后缀( 绝对 为什么 -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</code>,你有一个很好的 SQL 注入可能性,否则,例如。</p> <p>如果我的 SQL 引用正确,这将是修改后的 shell 函数:</p> <pre><code>function bootlaravel { local project="" 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 失败,return 将成为非零状态。我还将 project 声明为函数中的局部变量,以免用新的 shell 变量污染调用 shell。空行等主要是为了便于阅读。