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

时间:2016-07-29 15:53:15

标签: bash sed terminal .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!"
}

用法类似于bootlaravel LaravelProjectName

在使用sed命令修改.env文件的情况下,它实际上创建了一个.env-e文件作为现有.env文件的兄弟。我无法理解为什么要这样做。它虽然改变了所需要的字样。

感谢任何帮助

1 个答案:

答案 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。空行等主要是为了便于阅读。