Intereting Posts
Может ли BTRFS восстановить / продолжить работу после отказа диска в «одном» режиме? Понимание настроек Broadcom и файлов ядра Пользовательский процесс ISO Kickstart – пакеты для сопоставления RPM My Ubuntu 16.04 Установка с WordPress продолжает открывать процессы apache2, поедая память Установлена ​​новая установка Debian tmux вызывает смелые шрифты в vim Как X сопоставляет коды проверки ключа ядра с ключом? rsync вызывает ошибки после синхронизации Можно ли позволить фоновому процессу непрерывно выводить на терминал? bash, объединяющее расширение подстановочных знаков с расширением брекета Замена очереди теперь, когда пакет не принимает входные файлы? Как сделать двунаправленную трубку между двумя программами? dconf и терминал, не отображающий ту же информацию Почему ядро ​​Linux называется «образ»? Как привязать «вкладку» и «сдвиг + вкладку» на экране GNU?

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, потому что она была как-то не синхронизирована? Но почему система не синхронизирована?

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

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

 $ type foo foo is hashed (/a/foo)