Попробуйте передающее количество строк контекста к grep.
| grep -C 5
распечатает 5 строк прежде и после соответствия.
Вытяните ping
в свою собственную функцию и делают то, что Вы хотите там с результатами. В конце возвращают 0 или 1 в зависимости от состояния внутренне в функции.
ping_func(){
results=$(ping -c 1 -t 1 google.com &> /dev/null)
return $?
}
until [[ $min_time -lt $time ]] && ping_func; do
let time=SECONDS-start_time
let new_progress=COLUMNS*time/max_time
let diff=new_progress-progress
let progress=new_progress
for((i=0; i<diff; i++)); do
echo -n '#'
done
sleep 1
done
echo
Кроме того, можно использовать более тщательно продуманное case/switch
в функции, если необходимо действовать по-другому при получении различных состояний от ping
.
case "$status" in
1) return 0 ## success ;;
0) return 1 ## fail ;;
*) ### do something else ;;
esac
Ваша проблема в том, что ваша команда ping содержит -t 1
, чтобы сказать ping сдаться через 1 секунду. Это вызывает сигнал SIGALRM
, который ping не может отловить. (Возможно, это ошибка ping, но это не важно). Оболочка bash сообщает об этом как Alarm clock: 14
и прерывает процесс со статусом выхода 142
; 128 (это флаг "я поймал сигнал") + 14 (идентификатор SIGALRM).
Есть два способа справиться с этим:
1) Удалить -t 1
, чтобы SIGALRM не генерировался. Вместо этого ping завершится через (по моему опыту) 5 секунд и выдаст другой статус ошибки, чем вы сейчас видите; вероятно, 68, если указанный хост не может быть достигнут. В этом случае вы также можете добавить "-o" к вашему ping, чтобы он завершился, как только хост станет достижимым.
2) Выполните trap - SIGALRM
непосредственно перед командой ping, чтобы сказать оболочке игнорировать сигнал. 1-секундный тайм-аут все равно произойдет, и статус выхода будет 142
. По крайней мере, так было на iMac под управлением Yosemite (10.10.5), на котором я это пробовал.
ping
затем. – Tyilo 21.10.2013, 17:09grep
будет ожидать сплошной линии, однако выводы сценария#
на за один раз и я хочу видеть их 2), Это также удалило бы целую строку включая предыдущее#
3) Я думаюping
делает что-то какecho foobar > /dev/tty
, который не может быть заблокирован как этот. – Tyilo 21.10.2013, 17:39ping
команда в чат-комнате.-Q
нуждается в аргументе.ping -Q <some num> -c 1 -t 1 google.com
. – slm♦ 21.10.2013, 19:01