即使显式退出1,Bash脚本也始终返回0

时间:2016-05-05 11:53:28

标签: windows bash mercurial exit-code pre-commit-hook

问题:我正在尝试创建一个hg预提交挂钩。即使钩子调用的bash脚本中的唯一内容是“exit 1”,提交也会成功。

我尝试过的事情:

- 写了一个只有“退出1”的bash脚本。 (这仍然让提交继续。我希望提交被中止。)

- 在bash脚本中暂停以验证它是否正在执行。 (它正在执行)

-set precommit直接等于hgrc文件中的“exit 1”。这成功中止了提交,所以我知道钩子正在工作。

- 写了一个返回非零的python脚本,并停止了提交的发生。这验证了钩子正在使用python脚本。

从我的python脚本中调用了我的bash脚本,并在python中打印出bash脚本的返回值。这总是打印零,告诉我我的bash脚本无法正常工作。

Bash示例: hgrc文件:

[hooks]
precommit = pre-commit.sh

pre-commit.sh

#!/bin/sh
exit 1

Python示例: hgrc文件:

[hooks]
precommit = pre_commit.py

pre_commit.py:

#!/usr/bin/env python
import sys
import os

# I would expect this to print 1 since pre-commit.sh explicitly exits 1
# However this always prints 0
print os.system("pre-commit.sh")

# This is working fine. It succesfully aborts the commit
sys.exit(1)

我只想重申,这与python无关。我只使用python来检查我的bash脚本的值。问题是我的bash脚本总是返回0并且我需要它返回非零以便中止提交。 我有一种感觉,这是由于我运行窗户。我有git hooks工作,但我相信这是因为git bash解释了脚本。有什么建议?提前致谢。

1 个答案:

答案 0 :(得分:0)

你不能在Windows上使用“precommit.sh”,并希望它能在不告诉Windows如何使用它的情况下工作。

您可以使用这样的bat文件(因为操作系统知道如何处理它!):

int whatIsThis(const int b[], size_t n) {
    if (n == 0) {
        return 0;
    } else {
        return b[0] + whatIsThis(b + 1, n - 1);
    }
}