
Почему программа Linux which
требует обновления оболочки (например, ввода данных tcsh
в терминале), чтобы увидеть новые программы, установленные в вашем пути?
Я был озадачен, почему я не мог получить доступ к программе, у которой были такие же разрешения, как и у других программ в usr/local/bin
, которые which
могли ясно видеть.
Может ли кто-нибудь объяснить мне, как это работает, на простом языке?
решение1
Пытатьсяrehash
man tcsh
говорит
rehash Causes the internal hash table of the contents of the directo-
ries in the path variable to be recomputed. This is needed if
new commands are added to directories in path while you are
logged in. This should be necessary only if you add commands
to one of your own directories, or if a systems programmer
changes the contents of one of the system directories. Also
flushes the cache of home directories built by tilde expansion.
Проще говоря: tcsh хочет предоставить быстрый ответ, поэтому он создает внутреннюю таблицу (предположительно хэш-таблицу) команд и мест их нахождения. Предположительно, он делает это при запуске. К сожалению, у него нет механизма, который бы отслеживал, когда вы или администратор делаете что-то, что требует обновления этой таблицы.
Это одна из многих причин, по которым я предпочитаю ksh или bash производным от csh.
решение2
$ which test
/usr/bin/test
$ ls ~/bin/test
ls: cannot access bin/test: No such file or directory
$ touch ~/bin/test
$ chmod 755 ~/bin/test
$ which test
/home/daniel/bin/test
$
Никакого обновления оболочки не требуется при использовании Bash, поэтому оно which
само по себе не связано. Должны быть другие переменные.