【发布时间】:2019-12-20 06:50:10
【问题描述】:
我的 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
}
这个函数是有目的的,这是预期的行为:
首先,将bash仓库中.bash_aliases文件的内容替换为cat ~/.bash_aliases的stdout
第二,进入~/bash目录,这是一个git存储库
第三,暂存所有变化
第四,如果在调用aupgrade函数时,下面的参数是空的,只需提交“更新”消息,但如果用户写了一个参数,如aupgrade "New commit!",则提交随着消息等参数的变化,git commit -m $1
第五,推送改动
第六次,回到上一个目录
但是,它不这样做,而是这样做:
首先,将bash仓库中.bash_aliases文件的内容替换为cat ~/.bash_aliases的stdout
其次,进入~/bash目录,这是一个git存储库
第三,暂存所有变化
第四,尽管有参数,但提交“更新”消息
第五,推送改动
第六次,回到上一个目录
这很奇怪。这看起来是git push origin master 线的产品。这不是一个条件问题,因为当我编写另一个这样的函数但没有 git push origin master 行时,它可以正常工作。
为什么会这样?有什么解决办法吗?
【问题讨论】:
-
我可以推荐简化
if吗?请改用git commit -m "${1:-Update}"。 -
将
if [[ $1 == "" ]]; then更改为if [[ "$1" == "" ]]; then有帮助吗?这是基于shellcheck's 建议:双引号以防止通配符和分词。 -
调试 shell 脚本和函数的一般有用技巧:
set -x。现在,shell 在执行每个命令时打印(到 shell 的 stderr)。 (set +x清除标志。) -
!!正在通过历史扩展扩展为set -x,因为它位于双引号中,并且这是一个交互式 shell。 -
@MartínNieva,您从 git 获得的错误与是否从脚本调用程序无关,而是与您尝试推送的提交是否是当前远程头的子项有关。当您需要在远程 master 之上合并或 rebase 时,该错误是完全正常的。