带有消音器的 bash 重试功能

带有消音器的 bash 重试功能

我发现了一个 bash 函数,可以让我重试命令。

function retry {
  local n=1
  local max=50
  local delay=1
  while true; do
    "$@" && break || {
      if [[ $n -lt $max ]]; then
        ((n++))
        echo "[$n/$max] ($?) $@:" >&2
        sleep $delay;
      else
        fail "The command has failed after $n attempts."
      fi
    }
  done
}

function fail {
  echo $1 >&2
  exit 1
}

我这样用

$ retry ping -q -c 1 $ip

但是,重试命令时,我永远不想看到命令 stderr 或 stdout 输出。如何在重试时让命令静音?

答案1

如果你想让所有输出都静音命令由函数执行retry,改变

"$@" && break || {

到:

"$@" &>/dev/null && break || {

在脚本中或简单地将其与参数一起提供,例如:

retry "ping -q -c 1 $ip &>/dev/null"

但是如果你想要静音所有输出整个功能,要么注释掉echo脚本中的每一行并执行上面解释的更改,要么&>/dev/null在命令行上附加,例如:

retry ping -q -c 1 $ip &>/dev/null

答案2

我在 bsd/macos 上进行了测试,这似乎有效。另一个答案不起作用。我猜它也适用于我的 ubuntu 生产环境。

function retry {
  local n=1
  local max=50
  local delay=1
  echo contained "$@"
  while true; do
    eval "$*" &>/dev/null && break || {
      foo=$?
      if [[ $n -lt $max ]]; then
        ((n++))
        echo "[$n/$max] ($foo) $@" >&2
        sleep $delay;
      else
        fail "The command has failed after $n attempts."
      fi
    }
  done
}




retry "ping -q -c 1 $ip"

相关内容