我有两个shell脚本:
#!/bin/bash
set -e
travis_retry() {
local result=0
local count=1
while [ $count -le 3 ]; do
[ $result -ne 0 ] && {
echo -e "\n\033[33;1mThe command \"$@\" failed. Retrying, $count of 3.\033[0m\n" >&2
}
("$@" && result=0) || result=1
echo "result: $result"
if [ $result -eq 0 ]; then
echo "success"
else
echo "fail"
fi
[ $result -eq 0 ] && break
count=$(($count + 1))
sleep 1
done
[ $count -eq 3 ] && {
echo "\n\033[33;1mThe command \"$@\" failed 3 times.\033[0m\n" >&2
}
return $result
}
travis_retry ./fail.sh
(大部分来自网站)
另一个,./fail.sh
:
#!/bin/bash
echo "gonna fail"
sleep 5
exit 1
它会正确地重试失败,但当我重写fail.sh以0退出,并回显“gonna win”时,它显示“gonna win”,但仍然报告结果为0。
让我展示一个示例输出:
gonna fail
result: 1
fail
The command "./fail.sh" failed. Retrying, 2 of 3.
gonna fail
./fail.sh: line 4: xit: command not found
result: 1
fail
The command "./fail.sh" failed. Retrying, 3 of 3.
gonna win
result: 1
fail
如何才能达到预期的结果?如果fail.sh
开始报告退出代码0,另一个脚本也会成功。
就我所能得出的结论,这一行有这样一个问题:("$@" && result=0) || result=1
但是我不明白为什么它在成功时不赋值0。
1条答案
按热度按时间nwo49xxi1#
不要在表达式中使用括号:
括号创建一个子shell,因此
result=0
在这个子shell中执行,而不是在主脚本进程中执行。工作正常