У вас есть другой исполняемый файл с тем же именем где-нибудь в вашем $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
, чтобы очистить его.