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

问题描述 投票:0回答:2

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

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"]

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

node.js git bash githooks
2个回答
1
投票

它有可能在文件更改时被触发,并继续更改至少一个文件,这又会触发它(在文件更改时),这使其更改文件,这......等等。

打破这种情况的常用方法是生成一个标志文件(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
)将避免使用所述全局用户帐户特定设置。


0
投票

输入!在 vscode 的 git bash 终端中。

© www.soinside.com 2019 - 2024. All rights reserved.