Каждый сетевой адаптер в linux имеет булев параметр sysctl accept_local
(/proc/sys/net/ipv4/conf/eth0/accept_local
). Попробуйте установить его в 0 для всех задействованных адаптеров (дополнительно может потребоваться изменить таблицу маршрутизации в соответствии с тестовой настройкой).
Также убедитесь, что rp_filter
(/proc/sys/net/ipv4/conf/eth0/rp_filter
) включен (не 0).
Ссылка: http://code.metager.de/source/xref/linux/stable/Documentation/networking/ip-sysctl.txt
С круглыми скобками все работает так, как описано:([[ $r -gt 0 ]] && { echo foo $r; }) || ([[ $r -lt 0 ]] && { echo bar $r; }) || { echo foobar $r; }
Обратите внимание, что ваши случаи не пересекаются, поэтому на самом деле вам не нужен ||
.
[[ $r -gt 0 ]] && echo foo $r; # positive
[[ $r -lt 0 ]] && echo bar $r; # negative
[[ $r -eq 0 ]] && echo foobar $r; # zero
why is this not working
&&
и ||
оцениваются слева направо, между ними нет разницы в приоритете, что затрудняет выполнение с ними логики в стиле if.. then.. else
. Вам нужно добавить группировку вручную с помощью фигурных скобок или скобок. (Или просто используйте оператор if
, он существует не просто так.)
Например, это всегда печатает nonnegative
, независимо от того, печатает ли negative
:
[ $x -ge 0 ]] || echo negative && echo nonnegative
Если вы хотите, чтобы разница была положительной, вам нужно инвертировать ее в средней ветви, например.:
[[ $r -lt 0 ]] && echo bar $(( -r ));