Bash: чтение переполнения при использовании подстановки команд и SSH

Я схожу с ума!

Когда я запускаю этот скрипт bash (prof of concept) и кормлю его достаточно быстро, он теряет циклы:

# cat sample 
#!/bin/bash
tail -n 0 -f log | while read l
do
    SSH_CMD=$( ssh myhost.sample.com 'ls' )
    X=$( ping -c3 $l )
    echo $( echo "$X" | grep 'time=' | tail -1 | sed 's/.*\(time=.*\) .*/\1/' )
done 

# ./sample&
[1] 32434
# echo 8.8.8.8 >> log
time=5.17
# #->THIS IS OK!
# echo -e "8.8.8.8\n8.8.8.8\n8.8.8.8" >> log
time=4.98
# #->DAMN! It runs only once instead of three times

То же самое происходит, если я повторяю и достаточно быстро:

# echo 8.8.8.8 >> log

Почему цикл while выполняется только один раз ("теряя" циклы) вместо трех раз?

Примечание: если я прокомментирую строку с $( ssh ...)

#SSH_CMD=$( ssh myhost.sample.com 'ls' )

или заменить его на

SSH_CMD=$( sleep 3 && echo "blahhhshshs" )

и выдать:

    # echo -e "8.8.8.8\n8.8.8.8\n8.8.8.8" >> log
        time=4.98
        time=4.88
        time=5.12

Затем я получаю ожидаемый результат с тремя строками. Кажется, что использование подстановки команд с помощью ssh делает так, что цикл while теряет циклы. Может кто-нибудь объяснить, почему происходит такое переполнение и как его избежать, все еще используя $( ssh ..) (который на самом деле мне нужен для сбора данных)?

Ура, AaWnSd

0 ответов

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