如何从无限循环中停止bash脚本?

时间:2017-09-28 03:22:47

标签: node.js git bash githooks

我的项目目录中有这个bash脚本,命名为shrinkwrap.sh:

update_package_json_changed_files() {
  echo "> changed files"

  git diff --cached --name-only | grep -x package.json
}

update_shrinkwrap_and_at_to_git_index() {
  echo "> Updating npm-shrinkwrap.json and adding to current commit."

  npm shrinkwrap
  git add npm-shrinkwrap.json 
}

if get_package_json_changed_files; then
  update_shrinkwrap_and_at_to_git_index
fi

我在package.json中运行此脚本,如下所示:

"scripts": {
  "shrinkwrap": "bin/shrinkwrap.sh"
}

我安装了npm pre-commit以执行以下脚本:

"pre-commit": ["shrinkwrap"]

当我尝试提交时,脚本进入infinte循环。它一直在运行,没有什么可以阻止它。我尝试了命令+ C,控制+ Z.没有任何效果。有没有人遇到过这个问题?为什么会这样?

1 个答案:

答案 0 :(得分:1)

有可能在文件更改时触发它,并继续更改至少一个文件,该文件依次触发它(在文件更改时),这会使其更改文件,...等等。 / p>

打破这种情况的一种常用方法是生成一个标记文件(touch / tmp / in_progress),并仅在该文件时才调用update_shrinkwrap_and_at_to_git_index()
如果存在,请删除它(但不要做任何其他事情)

所以:

  • update_shrinkwrap_and_at_to_git_index()一个touch /tmp/in_progress
  • if get_package_json_changed_files;添加if [ -e /tmp/in_progress ]; then rm /tmp/in_progress; exit 0; fi 之前

OP Max Doung评论:

  

我在sudo前面添加了npm shrinkwarp,它确实停止了循环。当我取出它时,循环重新开始。想知道为什么?

这表明钩子是由用户本地设置触发的(例如~/.gitconfig中的设置)

使用其他帐户(此处为root,通过sudo)执行该命令可避免使用所述全局用户帐户特定设置。