在 FreeBSD 上是否有命令可以让 csh 重新读取路径中的所有目录?

在 FreeBSD 上是否有命令可以让 csh 重新读取路径中的所有目录?

csh我在使用 FreeBSD9作为 shell 时遇到了一个奇怪的问题。路径中新安装的程序只有在我重新启动cshshell 时才会启动。我觉得这真的很烦人。

我猜csh它会搜索路径一次,直到你退出它才会重新搜索它们。你如何强制它自我更新?你能放些什么东西.cshrc让它停止这样做吗?(我习惯了 bash,在 bash 中我没有看到任何类似的事情发生。)

答案1

Unix C shell 会散列您的搜索路径目录,以帮助它更快地找到可执行文件。但是,如果在它已经完成散列之后向这些目录添加新的可执行文件,它就会出现盲点。解决方案是使用命令rehash告诉它重建其散列。或者,您可以使用命令完全关闭路径散列(这会稍微影响性能)unhash

(Fwiw,我同意这是令人讨厌的行为。我在自己的汉密尔顿C壳,但我的足够智能,可以发现盲点并自动修复它们。)

答案2

如果您正在使用 的最新版本tcsh(我目前有tcsh 6.20.00 (Astron) 2016-11-24),您可以set autorehash(例如在您的~/.cshrc或在提示符下)在需要时启用“路径”目录的自动重新扫描(如 bash)。根据 tcsh 手册页:

  autorehash (+)
     If set, the internal hash table of the contents of the directories in the
     path variable will be recomputed if a command is not found in the hash table.  
     In addition, the list of available commands will be rebuilt for each command
     completion or spelling correction attempt if set to `complete' or `correct' 
     respectively;  if set to `always', this will be done for both cases.

不过,也存在一些边缘情况,如rehashtcsh 手册页的命令部分所述:

rehash  Causes the internal hash table of the contents of the directories
        in the path variable to be recomputed.
        ...
        With autorehash, a new command will be found automatically, except
        in the special case where another command of the same name
        which is located in a different directory already exists in the
        hash table.  Also flushes the cache of home  directories built
        by tilde expansion.

相关内容