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

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文件的兄弟.我实际上无法理解为什么会这样做.它虽然改变了所需的单词.

任何帮助表示赞赏

Kus*_*nda 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
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.空行等主要是为了便于阅读.

  • 为了避免任何意外,请始终用单引号括起脚本,而不是双重,并在必要时突破,例如`'s/DB_DATABASE = homestead/DB_DATABASE ='"$ PROJECT"'/ g'`并始终使用`&&` `cmd file> tmp`和`mv tmp file`,这样你就不会在失败时删除原始文件. (2认同)