Linux / bash не выполняет исполняемый файл, который «который» говорит мне

Наблюдение: у меня есть исполняемый файл foo, расположенный в / b / foo. Он скомпилирован против старого заголовка динамической библиотеки, вызывая его segfault при его выполнении:

$ foo Segmentation fault. // Expected behaviour. 

Теперь я компилирую новую версию foo в / a / foo в отношении новой динамической библиотеки, которая должна выполняться просто отлично. Каталог a / находится в моей $ PATH до b /, поэтому / a / foo следует выбрать:

 $ which foo /a/foo 

Когда я выполняю foo, происходит следующее:

 $ foo Segmentation fault. 

Поэтому кажется, что / b / foo выполняется, тогда как «which» говорит мне, что / a / foo должен быть выполнен. Чтобы сделать вещи более странными, когда я запускаю полный путь $ (который / a / foo), все работает нормально:

 $ /a/foo OK! $ cp /a/foo . $ ./foo OK! 

Чтобы сделать еще один шаг дальше, если теперь удалить / a / foo:

 $ rm /a/foo 

Тогда обязательно нужно выбрать / b / foo, правильно?

 $ which foo /b/foo $ foo bash: /a/foo: No such file or directory $ $(which foo) Segmentation fault. // Expected result. 

Неа!

Исправлено: Исходный .bash_profile и .bashrc, и проблема исчезает.

Воспроизводимость: каждый раз. Просто удалите / a / foo, source ~ / .bash_profile, создайте / a / foo, и вышеупомянутое наблюдение повторится.

Вопрос: Кто-нибудь знает, что здесь не так?

Гипотеза: «которая» обновлена, но система выбирает на основе «того, что было в этом случае». В моем примере выше, / a / foo еще не существовало, когда терминал был открыт: я только что создал его. Поэтому, когда была создана / a / foo, «которая» обнаружила / a / foo, но система все еще выбрала / b / foo, потому что она была как-то не синхронизирована? Но почему система не синхронизирована?

One Solution collect form web for “Linux / bash не выполняет исполняемый файл, который «который» говорит мне”

Bash кэширует расположение команд. Используйте hash foo чтобы заставить его обновить кеш.

Кроме того, это отдельная команда, которая не говорит вам, где находится ваша оболочка; он просто справляется с $PATH среды $PATH . В bash вместо этого вы должны использовать type :

 $ type foo foo is hashed (/a/foo) 
  • Использование emacsclient с пользовательскими emacs в $ PATH
  • построение кода из исходного кода и добавление их к вашему пути
  • Как добавить путь к системе $ PATH для оболочки всех пользователей без входа и оболочки входа в debian
  • Безопасный способ установки сценария .sh в / usr / local / bin?
  • Добавление путей к PATH с использованием многострочного синтаксиса
  • Как я могу чисто добавить к $ PATH?
  • Unix устанавливает лучшие практики, присоединяется к пути или через
  • Как сбросить $ PATH на CentOS 6.5
  • Внутренний путь не установлен в GVim при запуске из gvim.desktop
  • Найти абсолютный путь из скрипта
  • Почему перезагрузка PATH в команде sudo?
  • Linux и Unix - лучшая ОС в мире.