Похоже, у вас есть 2 устройства с одной подсетью. Обычно это работает плохо / неожиданно. У вас должны быть разные подсети, или вам нужно отключить ARP.
например. Чтобы отключить ARP:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
Но я уверен, что есть лучший подход к любой вашей проблеме. Возможно, вам стоит сделать мост и использовать только один IP-адрес. Например:
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ip a add ... dev br0
Или два адреса на одной сетевой карте, или 2 разные подсети (например, 192.168.123.0/24 и 192.168.124.0/24).
Вы можете использовать фигурные скобки для группировки команд без создания подоболочки.
X=$(getinfo.sh) || { echo "failed" && exit 1; }
Из раздела Grouping Commands в руководстве Bash
{list; }
Помещение списка команд между фигурными скобками приводит к тому, что список будет выполняться в текущем контексте оболочки. Подоболочка не создается. Точка с запятой (или новая строка) после списка обязательна.
Примечание: обратные кавычки для подстановки команд не рекомендуются, поэтому я использовал более современный синтаксис $ ()
.
(...)
не (в первую очередь) для групповых команд, а для запуска подоболочки. Таким образом, exit
в (echo failed && exit 1)
выходит только из подоболочки.
Чтобы сгруппировать команды, не выполняя их в подоболочке, вы должны использовать {...; }
вместо:
X=`getinfo.sh` || {
echo >&2 "failed"
exit 1
}
Хотя здесь я бы предпочел использовать:
if ! x=$(getinfo.sh); then
echo >&2 failed
exit 1
fi
Также обратите внимание, что ваше эхо не удалось && exit 1
может не завершиться, если само эхо
не сработает что может произойти для intance, когда stdout - это файл в полной файловой системе, или сломанный канал с игнорированием SIGPIPE, или stdout был закрыт, или был достигнут предел размера файла с игнорированием SIGXFSZ ...
Самый простой способ - добавить -e в ваш shebang:
#! / Bin / bash -e
Это означает, что скрипт остановится при первой ошибке. Поскольку вы используете обратную кавычку, если есть какое-либо сообщение об ошибке, вы, вероятно, все равно увидите его в своем стандартном выводе.
Если вы действительно хотите использовать свой метод echo-and-exit, я бы написал отдельную функцию, которая будет вызываться, которая всегда выводит сообщение об ошибке и немедленно завершает работу. Посмотрите, как писать функции bash (они действительно простые).
Поскольку вы устанавливаете значение переменной, почему бы не проверить значение переменной и не выйти, если оно неуместно?
X=`getinfo.sh`
[ -z "$X" ] && echo "failed" && exit 1
Предполагается, что getinfo.sh
вернет пустой при ошибке (если X
имеет нулевую длину, выйти), но вы можете изменить проверку на основе того, что getinfo
возвращается в случае сбоя. Или, что более уместно, убедитесь, что X
содержит именно те данные, которые вы ищете.