Ух ты, я думаю, вы заметили эффект от функции малых очередей TCP. В пределах одной машины небольшие очереди TCP ограничат пакеты, поставленные в очередь в qdiscs и буферах устройств, до 128 КБ по умолчанию.
TCP будет регулироваться при достижении этого предела без фактического переполнения каких-либо буферов.
Это говорит о том, что для получения дропов вам нужно соединить 3 ВМ (, то есть отдельные эмулированные ядра )вместе -отправителя, «маршрутизатора» и получателя.
Я смутно припоминаю, что могут быть причины для использования отдельных компьютеров/ВМ при использовании netem
для имитации задержки или ограниченной пропускной способности. Кажется, что это хорошая практика в целом.
Я нашел причину, по которой это не работает, а также решение. Как прокомментировал @eike в моем OP, проблема заключалась в том, что возврат каретки \r из DOS перезаписывал вывод. Для меня более проблематично то, что \r по какой-то причине был добавлен к моей переменной.
Удаление \r вручную не представлялось возможным, поскольку этот файл регулярно обновляется.
Немного поискав, я обнаружил, что это решает мою проблему и правильно распечатывает строку:
#!/bin/bash
version=$(sed 's/\r$//' test.txt | sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p")
printf 'detected version %s for test.txt\n' "$version"
Здесь он сначала удаляет \r из текста и передает его в часть регулярного выражения. и я получаю ожидаемый результат:
detected version 0.6 for test.txt
Я уверен, что есть способ сделать это из регулярного выражения, чтобы игнорировать \r, но это, по крайней мере, сделало работу!