Однострочная команда, которая устанавливает код ошибки 1, если строка в многострочном стандартном вводе, 0, если нет - PullRequest
0 голосов
/ 05 мая 2020

Когда я запускаю команду

nmcli --get-values TYPE connection show --active

, я иногда получаю следующий список значений

vpn
802-3-ethernet
tun
tun

Но в других случаях строка vpn отсутствует. (порядок строк нельзя предполагать)

Я ищу однострочник, который примет вывод этой nmcli команды (предположительно через pipe / stdin?) и вернет код выхода 1, если vpn находится в этом списке, и код выхода 0, если vpn нет в этом списке.

Что я пробовал

  • Каждая комбинация grep что я могу думать. grep -v будет абсолютно не работать, потому что он всегда найдет строку, отличную от vpn. Другие варианты grep возвращают данные, но не меняют код ошибки (который я могу найти).
  • Каждое отрицательное регулярное выражение, которое я могу найти или придумать. Регулярные выражения в форме ^(?!vpn).*$ не работают, потому что всегда будет строкой, в которой не указано vpn.

Вариант использования

Я написание службы systemd для обновления моего Dynami c DNS. Но я не хочу устанавливать свой динамический c DNS, пока я использую VPN. Я хочу использовать встроенные возможности systemd (насколько это возможно) для управления им. Поэтому я хочу использовать встроенный в systemd ExecStartPre= (который дает сбой модуля при коде выхода 1+) для управления запуском службы.

Если у вас есть способ запустить службу (или нет) с использованием systemd в зависимости от того, подключен ли VPN, я приму это вместо вышеизложенного. Но наивные предположения вроде «tun0 active = VPN» для меня неверны. У меня одновременно активны различные tun подключений по разным причинам. Таким образом, запуск по sys-subsystem-net-devices-tun0.device не работает.

Что не работает

Большинство результатов Google и SO, которые я нахожу, относятся к отрицанию c с указанием строки и не относятся к моему вариант использования, когда будет несколько строк. Или они возвращают значения и не устанавливают код ошибки. Мне нужен набор кодов ошибок.

1 Ответ

1 голос
/ 05 мая 2020

Вместо того, чтобы просто проверять наличие vpn в выходных данных, подсчитайте количество вхождений, затем оцените условное выражение, проверяющее количество строк:

nmcli --get-values TYPE connection show --active | [ $(grep -c ^vpn) -eq 0 ]
...