Установка завершается, brew сообщает, что openvpn на месте, а оболочка отвечает command not found. Бинарник существует, просто он лежит в каталоге, о котором оболочке никогда не сообщали. Homebrew связывает бинарники демонского типа в каталог sbin префикса, а стандартный PATH в macOS обычно включает каталог bin и не включает sbin. Ничего не сломано, и никакая переустановка этого не изменит.

Четыре проверки подтверждают механизм, прежде чем вы измените любой файл оболочки.

Что формула на самом деле устанавливает

Формула openvpn собирает демон командной строки, поэтому её исполняемый файл попадает под sbin, а не под bin. Затем Homebrew связывает этот бинарник с каталогом sbin префикса, и именно поэтому "$(brew --prefix)/sbin/openvpn" --version работает, а голый вызов нет. Каталог Cellar с номером версии тоже хранит копию, и запись этого пути в файл запуска — это способ, которым машина после обновления остаётся привязанной к старой сборке.

Символическая ссылка префикса — это стабильный путь. Путь Cellar — деталь реализации с номером версии внутри.

Спрашивайте Homebrew, а не файловую систему

Начните с менеджера пакетов, потому что он знает, какая установка владеет формулой: command -v brew, brew --prefix, brew list --versions openvpn, brew --prefix openvpn. Если последняя печатает путь, формула присутствует, и вопрос исключительно о разрешении. Если она ничего не печатает, оболочка ищет не в том месте пакет, который никогда не устанавливался, а это другая проблема с другим решением.

Две установки Homebrew на одной машине — это то место, где это важнее всего: brew, который отвечает, не обязательно тот brew, который устанавливал.

Почему оболочка не видит sbin

Оболочка входа строит PATH из системных значений по умолчанию плюс всего, что добавляют ваши файлы запуска. Homebrew bin обычно добавляется, а Homebrew sbin обычно нет, поэтому все команды работают, кроме демонов. command -v openvpn, который ничего не возвращает, тогда как путь с префиксом возвращает версию, — это весь диагноз в двух командах. Подтвердите, что каталог действительно содержит ссылку, с помощью ls -l "$(brew --prefix)/sbin/openvpn".

Отсутствующая ссылка — это другая неисправность, чем отсутствующая запись PATH, и только одна из них исправляется редактированием файла оболочки.

Исправьте путь один раз, в одном месте

Для быстрой проверки в текущей оболочке eval "$(brew shellenv)" задаёт переменные установки и ставит оба каталога в начало. Для постоянного порядка поместите строку shellenv в единственный файл запуска, который ваша оболочка читает для используемого режима входа, вместо того чтобы разбрасывать экспорты по файлам bash и zsh.

Затем откройте новый терминал и повторите запрос версии, потому что кэшированная оболочка продолжает сообщать старый PATH.

Держите обнаружение отдельно от службы

Найти бинарник — не то же самое, что запускать службу VPN. Автоматический запуск openvpn добавляет требования к профилю, учётным данным, привилегиям и жизненному циклу, которых обнаружение пакетов никогда не касалось. Tunnelblick также приносит собственный движок, поэтому версия, которую вы только что напечатали, может не иметь ничего общего с версией, которую использует приложение.

Запишите, какой исполняемый файл выдал вывод версии. Эта одна строка экономит час в следующий раз, когда две версии разойдутся.

Похожие статьи