这里有几层,所以请耐心等待。
我的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;
答案 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