Использовать арифметику bash:
if (( (a-b) > 3 )) || (( (b-a) > 3 )); then
echo fail
fi
Основано на предположении @ctrl -alt -Делора.
Рассмотрим, чтоcat
(делает сам по себе ):читает со своего входа в буфер в памяти (, размер которого определяется cat
), и записывает на свой стандартный вывод. чтение и запись блокируются :до тех пор, пока они не достигнут конца ввода, чтение будет остановлено и будет ожидать данных, если это необходимо, и аналогичным образом запись будет остановлена и будет ждать для записи данных при необходимости. Это обеспечивает некоторую связь между выходом и вводом; если вход может предоставить данные быстрее, чем выход может их воспринять, запись будет заблокирована, и cat
, таким образом, прекратит чтение, пока не сможет снова записать.
Кэши операционной системы немного усложняют картину, но существенно не меняют поведение. В частности, для записи, вместо того, чтобы ждать, пока цель сохранит данные, операционная система обычно сохраняет записанные данные в кэше и позже сбрасывает их. С точки зрения cat
это позволяет записывать больше данных (, пока есть входные данные на другой стороне )до того, как cat
придется остановиться.Однако основной принцип не меняется, и когда запись выполняется медленнее, чем чтение, операционная система в конечном итоге решит заблокировать запись (, например. из-за того, что в кэше слишком много данных, ожидающих записи, или из-за слишком долгого ожидания ).