shell Bash -在set -e处于活动状态时正确重试命令

bweufnob  于 2023-02-24  发布在  Shell
关注(0)|答案(1)|浏览(154)

我有两个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。

nwo49xxi

nwo49xxi1#

不要在表达式中使用括号:

("$@" && result=0) || result=1

括号创建一个子shell,因此result=0在这个子shell中执行,而不是在主脚本进程中执行。

"$@" && result=0 || result=1

工作正常

相关问题