Как я могу напечатать и выйти из bash, если оператор backtick не работает

Похоже, у вас есть 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).

3
12.09.2016, 15:54
4 ответа

Вы можете использовать фигурные скобки для группировки команд без создания подоболочки.

X=$(getinfo.sh) || { echo "failed" && exit 1; }

Из раздела Grouping Commands в руководстве Bash

 {list; } 
 

Помещение списка команд между фигурными скобками приводит к тому, что список будет выполняться в текущем контексте оболочки. Подоболочка не создается. Точка с запятой (или новая строка) после списка обязательна.

Примечание: обратные кавычки для подстановки команд не рекомендуются, поэтому я использовал более современный синтаксис $ () .

3
27.01.2020, 21:13

(...) не (в первую очередь) для групповых команд, а для запуска подоболочки. Таким образом, 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 ...

{{1} }
5
27.01.2020, 21:13

Самый простой способ - добавить -e в ваш shebang:

#! / Bin / bash -e

Это означает, что скрипт остановится при первой ошибке. Поскольку вы используете обратную кавычку, если есть какое-либо сообщение об ошибке, вы, вероятно, все равно увидите его в своем стандартном выводе.

Если вы действительно хотите использовать свой метод echo-and-exit, я бы написал отдельную функцию, которая будет вызываться, которая всегда выводит сообщение об ошибке и немедленно завершает работу. Посмотрите, как писать функции bash (они действительно простые).

0
27.01.2020, 21:13

Поскольку вы устанавливаете значение переменной, почему бы не проверить значение переменной и не выйти, если оно неуместно?

X=`getinfo.sh`

[ -z "$X" ] && echo "failed" && exit 1

Предполагается, что getinfo.sh вернет пустой при ошибке (если X имеет нулевую длину, выйти), но вы можете изменить проверку на основе того, что getinfo возвращается в случае сбоя. Или, что более уместно, убедитесь, что X содержит именно те данные, которые вы ищете.

1
27.01.2020, 21:13

Теги

Похожие вопросы