为什么退出我的状态在命令行中有效但在bash脚本中无效? (击)

时间:2018-02-16 20:26:43

标签: bash githooks exit-code

这里有几层,所以请耐心等待。

我的docker-container ssh -c"echo 'YAY!'; exit 25;"命令在我的docker容器中执行echo 'YAY!'; exit 25;。它返回:

YAY
error:  message=YAY!
, code=25

我需要知道容器中的命令是否成功,所以我将以下内容添加到命令中:

docker-container ssh -c"echo 'YAY!'; exit 25;"  >&1 2>/tmp/stderr; cat /tmp/stderr | grep 'code=' | cut -d'=' -f2 | { read exitStatus; echo $exitStatus; }

这将stderr发送到/ tmp / stderr,并且echo $exitStatus返回:

YAY!
25

所以,这正是我想要的。我想将$ exitStatus保存到变量中。我的问题是,我将它放入bash脚本(GIT预提交)中,当执行此确切代码时,退出状态为null

这是我的bash脚本:

# .git/hooks/pre-commit

if [ -z ${DOCKER_MOUNT+x} ];
then
    docker-container ssh -c"echo 'YAY!'; exit 25;"  >&1 2>/tmp/stderr; cat /tmp/stderr | grep 'code=' | cut -d'=' -f2 | { read exitStatus; echo $exitStatus; }

    exit $exitStatus;
else
    echo "Container detected!"
fi;

1 个答案:

答案 0 :(得分:1)

那是因为你在管道中设置变量。管道中的每个命令都在子shell中运行,当子shell退出时,变量不再可用。

bash允许您在当前shell中运行管道的 last 命令,但您还必须关闭作业控制

一个例子

# default bash
$ echo foo | { read x; echo x=$x; } ; echo x=$x
x=foo
x=

# with "lastpipe" configuration
$ set +m; shopt -s lastpipe

$ echo foo | { read x; echo x=$x; } ; echo x=$x
x=foo
x=foo

set +m; shopt -s lastpipe添加到您的脚本中,您应该很好。

正如查尔斯评论的那样,有更有效的方法可以做到这一点。像这样:

source <(docker-container ssh -c "echo 'YAY!'; exit 25;" 2>&1 1>/dev/null | awk -F= '/code=/ {print "exitStatus=" $2}')
echo $exitStatus