bash função de repetição com silenciador

1

Eu encontrei uma função bash, que me permite repetir comandos.

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
}

Eu uso isso assim

$ retry ping -q -c 1 $ip

No entanto, ao tentar novamente comandos, nunca quero ver os comandos stderr ou stdout. Como posso silenciar o comando ao tentar novamente assim?

    
por american-ninja-warrior 02.01.2018 / 13:03

2 respostas

0

Se você quiser silenciar todas as saídas de o comando executadas pela função retry , altere

"$@" && break || {

para:

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

no script ou simplesmente apresente o argumento, por exemplo:

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

Se, no entanto, você quiser silenciar todas as saídas de toda a função , comente todas as linhas echo em seu script e faça a alteração explicada acima ou anexe &>/dev/null na linha de comando, por exemplo:

retry ping -q -c 1 $ip &>/dev/null
    
por dessert 02.01.2018 / 13:30
-1

Eu faço meu teste em bsd / macos, isso parece funcionar. A outra resposta não funcionou. Eu estou supondo que também funcionaria no meu ambiente de produção do 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"
    
por american-ninja-warrior 02.01.2018 / 13:51