有时,我的“git ls-remote”语句通过HTTP返回401 Unauthorized状态,但并非总是如此。如何在Bash中捕获此错误状态,以便在获得HTTP 401状态时不继续使用我的Bash脚本?
我这样做:
#!/bin/bash
GSERVER_STATUS=$(git ls-remote http://$GREMOTE/$GGROUP/$GREPO.git master | cut -f 1)
# rest of script goes here
大约50%的时间,它有效。另外50%,我得到了:
error: The requested URL returned error: 401 while accessing http://USER:PASS@SERVER/GROUP/REPO.git/info/refs
fatal: HTTP request failed
(当然,我更改了上面的一行,以保持我的登录凭据匿名。)
答案 0 :(得分:1)
您可以通过/tmp/TSTRET
将其重定向到文件,例如2>/tmp/TSTRET
,然后测试该文件是否为空,或者cat
该文件并测试结果以查看是否它是NULL:
#!/bin/bash
GSERVER_STATUS=$(git ls-remote http://$GREMOTE/$GGROUP/$GREPO.git master 2>/tmp/TESTRET | cut -f 1)
if [[ -n `cat /tmp/TESTRET` ]]
then exit;
fi
# rest of script goes here
如果字符串-n
为NOT NULL,则cat /tmp/TESTRET
返回true,表示生成了错误消息。 [ ]
是test
的替代语法。
注意:我实验性地评估了GSERVER_STATUS的价值而没有一贯的运气。
另外 - 我在这里使用了反引号,但$(cat /tmp/TESTRET)
也适用于这种情况。
如果您想查看产生的错误,可以在cat
块中插入if
:
if [[ -n $(cat /tmp/TESTRET) ]]
then
cat /tmp/TESTRET;
exit;
fi
最后,如果从其他脚本中调用此脚本,则可能不希望调用exit
,因此您可以将其他代码嵌套到内部以避免完全退出脚本:
if [[ -n $(cat /tmp/TESTRET) ]]
then
cat /tmp/TESTRET;
else
# rest of script goes here
# ...
fi
或
if [[ -z $(cat /tmp/TESTRET) ]]
then
# rest of script goes here
# ...
else
cat /tmp/TESTRET;
fi