функция повтора баш с глушителем

Я нашел функцию 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
задан 2 January 2018 в 15:10

2 ответа

Если вы хотите отключить все выходные данные команды , выполняемой функцией retry, измените

"$@" && break || {

на:

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

в сценарий или просто дать его вместе с аргументом, например:

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

Если вы, однако, хотите отключить весь вывод всей функции , либо закомментируйте каждый echo в вашем скрипте и внесите изменения, описанные выше, или добавьте &>/dev/null в командную строку, например:

retry ping -q -c 1 $ip &>/dev/null
0
ответ дан 2 January 2018 в 15:10

Я тестирую на 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"
-1
ответ дан 2 January 2018 в 15:10

Другие вопросы по тегам:

Похожие вопросы: