“ git push origin master”在bash脚本中给出了奇怪的行为

时间:2019-12-20 06:50:10

标签: bash git

我的bashrc文件中有这个简单的功能

function aupgrade {
    cat ~/.bash_aliases > ~/bash/.bash_aliases
    cd ~/bash
    git add .

    if [[ $1 == "" ]]; then
        git commit -m "Update"
    else
        git commit -m "$1"
    fi

    git push origin master

    cd - 1>/dev/null
}
  

此功能的目的在于,这是预期的行为:

首先,用cat ~/.bash_aliases

的标准输出替换bash存储库中.bash_aliases文件的内容。

第二,进入~/bash目录,该目录是git仓库

第三,暂存所有更改

第四,如果在调用aupgrade函数时以下参数无效,则只需提交“ Update”消息,但如果用户写了一个参数,例如{{1} },使用诸如消息aupgrade "New commit!"

这样的参数来提交更改。

第五,推送更改

第六,返回上一个目录

  

但是,它不会那样做,而只会这样做:

首先,用git commit -m $1

的标准输出替换bash存储库中.bash_aliases文件的内容。

第二,进入cat ~/.bash_aliases目录,该目录是git仓库

第三,暂存所有更改

第四,尽管有参数,也请提交“ Update”消息

第五,推送更改

第六,返回上一个目录

这很奇怪。这看起来是~/bash行的乘积。这不是有条件的问题,因为当我编写这样的另一个函数但没有git push origin master行时,它可以按预期工作。

为什么会这样?有什么解决办法吗?

这是set -x向我显示的内容,这真的很奇怪 set -x's output

1 个答案:

答案 0 :(得分:0)

所以我已经测试了您的代码,我唯一发现的问题是,除非将第一个参数作为带有多个感叹号的字符串传递,否则会插入相同的命令(或上一个?),除非您将其转义:

enter image description here

这看起来确实是给您的,但是您事先运行过“ set -x”,因此它用该命令替换了双感叹号。

我还建议将函数参数存储在命名局部变量中,以获取更简洁的代码。