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

How to stop a bash script from an infinite loop?

我的项目目录中有这个 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"]

当我尝试提交时,脚本进入无限循环。它保持 运行ning,没有什么能阻止它。我尝试了 command + C、control + Z。没有任何效果。以前有人 运行 处理过这个问题吗?为什么会这样?

它有可能在文件更改时被触发,并继续更改至少一个文件,这反过来又触发它(在文件更改时),这使得它更改了一个文件,这...等等.

打破它的一种常用方法是生成一个标志文件(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条评论:

I added sudo to in front of npm shrinkwarp, and it did stop the loop.when I take it out, loop starts again. Wondering why?

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

使用不同的帐户(此处 rootsudo)执行命令将避免使用所述全局用户帐户特定设置。