2017-09-28 133 views
1

我命名爲shrinkwrap.sh我的項目目錄有這樣的bash腳本:如何從無限循環停止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": ["shrinkwrap"] 

當我嘗試提交時,腳本進入一個無限循環。它一直在運行,沒有任何東西可以阻止它。我試過命令+ C,控制+ Z.沒有任何工作。有沒有人遇到過這個問題?爲什麼會這樣呢?

回答

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

我將sudo添加到npm shrinkwarp前,並且它確實停止了循環。當我將它取出時,循環再次啓動。想知道爲什麼? –

+0

@MaxDoung我編輯了答案以迴應您的評論。 – VonC

+0

我還有兩個問題。我在哪裏取代(touch/tmp/in_progress)。另外,你能解釋一下爲什麼這個無限循環會發生嗎?我對此沒有經驗。非常感謝。 –