¿Cómo detener un script bash desde un ciclo infinito?

Tengo este script bash en mi directory de proyectos llamado 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 

y estoy ejecutando este script en package.json como el siguiente:

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

e instalé npm pre-commit para ejecutar el script de la siguiente manera:

 "pre-commit": ["shrinkwrap"] 

cuando bash comprometer, el script entra en un bucle infinte. Sigue corriendo, y nada puede detenerlo. Intenté command + C, control + Z. Nada funcionó. ¿Alguien se encontró con este problema antes? ¿por qué está sucediendo eso?

Es posible que se active en el cambio de file y proceda a cambiar al less un file, lo que a su vez lo activa (en el cambio de file), lo que hace que cambie un file, que … y así sucesivamente.

Una forma habitual de romper eso es generar un file de indicador (touch / tmp / in_progress) y llamar a update_shrinkwrap_and_at_to_git_index() solo si ese file no existe.
Si existe, elimínelo (pero no haga nada más)

Asi que:

  • update_shrinkwrap_and_at_to_git_index() a touch /tmp/in_progress y
  • antes if get_package_json_changed_files; agregue un if [ -e /tmp/in_progress ]; then rm /tmp/in_progress; exit 0; fi if [ -e /tmp/in_progress ]; then rm /tmp/in_progress; exit 0; fi

El OP Max Doung comenta:

npm shrinkwarp sudo a npm shrinkwarp , y detuvo el ciclo. Cuando lo saco, el ciclo comienza de nuevo. ¿Preguntándome por qué?

Eso sugiere que el enganche es desencadenado por una configuration local del usuario (una en ~/.gitconfig por ejemplo)

Ejecutar el command con una count diferente (aquí, root , a través de sudo ) evitaría usar dicha configuration global específica de la count de usuario.