Команда вызвана из одного пути, “which” говорит, что она должна быть вызвана из другого места.

Вопрос или проблема

Я создал исполняемый файл, который, для целей этого вопроса, называется foo. Уже существует версия этого файла по адресу /usr/bin/foo, и я устанавливаю другую версию как /usr/local/bin/foo. Мой путь имеет /usr/local/bin перед /usr/bin.

Теперь, если я выполню which foo, я получу /usr/local/bin/foo, как и ожидалось. Однако, когда я просто вызываю foo, запускается /usr/bin/foo (это подтвердилось проверкой его ссылки /proc/1234/exe, где 1234 – это pid).

Я проверил свои псевдонимы, псевдонима для foo нет.

Какова может быть причина выбора /usr/bin/foo при вызове foo?

Примечание: Я запускаю Devuan GNU/Linux 6 (excalibur/ceres).

Ответ или решение

Вопрос: Команда, вызываемая из одного пути, "which" говорит, что она должна вызываться из другого места.

Недавно у вас возникла ситуация, связанная с вашим исполняемым файлом под названием foo. Вы установили версию этого файла в директорию /usr/local/bin, в то время как старый экземпляр уже существует в /usr/bin. Ваш текущий PATH настроен так, чтобы /usr/local/bin располагался перед /usr/bin, что обычно означает, что при вызове команды foo должен исполняться файл из /usr/local/bin. Тем не менее, при запуске команды вы наблюдаете, что исполняется версия из /usr/bin.

Возможные причины выбора версии /usr/bin/foo:

  1. Контекст выполнения: Возможно, вы запускаете foo в контексте, который игнорирует ваш текущий PATH. Это может происходить, если вы используете оболочку, которая изначально настроена по-другому, или если в самом скрипте или исполняемом файле имеется явный путь к /usr/bin/foo.

  2. Отладка и управление процессами: Вы, вероятно, уже проверили символическую ссылку в /proc/1234/exe, что указывает на экземпляр /usr/bin/foo. Это хороший метод проверки, но стоит также удостовериться, что PID соответствует именно тому процессу, который вы запускали.

  3. Системные переменные и окружение: Проверьте переменные окружения, которые могут влиять на выполнение. Используйте команду env для вывода всех переменных окружения. Возможные конфликты могут возникать, если есть система управления программами или оболочка, которая влияет на поведение.

  4. Зараженная память: В редких случаях может происходить выбор исполняемого файла из кеша подгружаемой библиотеки или остатка ранних условий выполнения, однако это маловероятно.

  5. Конфликты с другими оболочками: Если вы используете несколько оболочек (например, bash и zsh), убедитесь, что они используют один и тот же путь. Некоторое поведение может меняться между оболочками.

Рекомендации по устранению проблемы:

  • Проверьте ваш PATH. Выполните команду echo $PATH, чтобы убедиться, что порядок директорий указан правильно.

  • Изучите конфигурации ваших оболочек. Откройте такие файлы, как ~/.bashrc, ~/.bash_profile, ~/.profile или ~/.zshrc, чтобы убедиться в отсутствии конфликтующих настроек.

  • Перезапустите оболочку или сессию. Иногда перезапуск может помочь решить временные конфликтные ситуации.

  • Используйте полные пути. Попробуйте запустить /usr/local/bin/foo напрямую, чтобы убедиться, что это работает.

  • Проверьте на наличие установленных алиасов и функций. Даже если вы не создали алиасы, убедитесь, что ни одна функция не перекрывает foo команду.

Заключение

Описание вашей проблемы указывает на возможный конфликт в окружении или каширование исполняемого файла. С использованием вышеуказанных рекомендаций вы сможете эффективно устранить эту проблему и обеспечить корректное выполнение нужной версии вашего исполняемого файла. Если проблема все еще сохраняется, может потребоваться более детальное исследование конфигураций системы и компонентов оболочки.

Оцените материал
Добавить комментарий

Капча загружается...