Проблема: Невозможно выполнить правильный исполняемый файл в Unix - PullRequest
0 голосов
/ 26 ноября 2010

Я столкнулся с действительно странной проблемой, любая помощь приветствуется.

У меня есть исполняемый файл, скомпилированный и загруженный в определенное место. Имя этого исполняемого файла - "qact". В первой строке основной функции есть вновь добавленный оператор cout. Но когда я выполняю двоичный файл в этом каталоге, я не вижу его. Через некоторое время я случайно обнаружил, что если я не нахожусь в этом каталоге, я могу увидеть выданную строку, когда я ее выполняю.

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

когда я использую какой в ​​этом исполняемом файле, независимо от того, в каком каталоге я нахожусь, я всегда получаю один и тот же результат, и это правильное местоположение.

Действительно смущен ..

1 Ответ

2 голосов
/ 26 ноября 2010

У вас есть другой исполняемый файл с тем же именем где-нибудь в вашем $PATH?Если это так, возможно, что bash выполняет неверный исполняемый файл, потому что он использует хеш-таблицу, чтобы избежать дополнительных $PATH поисков (см. Поиск и выполнение команд ).

Например, предположим, что ваш$PATH - это /opt/local/bin:/usr/bin, а grep установлен только в /usr/bin.Когда вы выполните grep, вы получите очевидный результат:

$ echo $PATH
/opt/local/bin:/usr/bin
$ which grep
/usr/bin/grep
$ grep --version
grep (GNU grep) 2.5.1

Теперь предположим, что вы установили более новую версию grep в /opt/local/bin, что раньше в $PATH, чем /usr/bin.Поскольку which всегда выполняет полный поиск $PATH каждый раз, но bash сохраняет хэш-таблицу, bash по-прежнему считает, что команда grep отображается на команду в /usr/bin:

$ which grep
/opt/local/bin/grep
$ grep --version
grep (GNU grep) 2.5.1
$ /opt/local/bin/grep --version
GNU grep 2.6.3

Youможно использовать type встроенный для диагностики этой проблемы.type сообщит вам, является ли команда встроенной оболочкой, псевдонимом, функцией, ключевым словом или исполняемым файлом.Если последний, он говорит вам полный путь к исполняемому файлу:

$ type grep
grep is hashed (/usr/bin/grep)

Так как вы это исправите?Вы можете использовать встроенную функцию hash для управления хэш-таблицей (для получения дополнительной информации введите help hash).Если вы просто хотите исправить одну запись (grep в этом случае), вы можете сделать hash -d grep, чтобы сказать «удалить запись хеш-таблицы для grep», и в этом случае при следующем выполнении grep онабудет искать полный $PATH, как ожидалось.Если вы хотите очистить всю хеш-таблицу (скажем, если вы только что установили большое количество нового программного обеспечения или изменили $PATH), то используйте hash -r, чтобы очистить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...