【问题标题】:Why "hash /bin/ls" does nothing?为什么“哈希/bin/ls”什么都不做?
【发布时间】:2020-05-30 13:06:17
【问题描述】:

使用一些相对或绝对路径编写命令hash,无论是文件、目录还是无处,它似乎什么都不做。

$> hash /bin/ls
prints nothing ***

$> hash /path/to/nowhere
prints nothing ***

$> hash ../same/as/above
same thing ***

这是为什么呢?

【问题讨论】:

  • 您期待什么? hash foo 只是让 shell 记住 foo 解析的内容,这样它就不必在每次运行 foo 时执行路径查找。
  • 我知道,“hash foo”返回消息hash: foo: not found。但是当涉及到路径时,它什么也不返回

标签: bash shell unix hash terminal


【解决方案1】:

hash 执行命令搜索并记住解析的位置。当名称中有斜杠时,部分命令搜索会跳过它*。因此,hash foo/bar 什么都不做。

相关 POSIX 规范:

hash:

哈希实用程序将影响当前 shell 环境记忆实用程序位置的方式,如命令搜索和执行中所述。 [...] 它应将实用程序位置添加到其记住的位置列表中

Command Search and Execution:

如果命令名称包含至少一个<slash>,shell 将在单独的实用程序环境中执行该实用程序,其操作等同于调用 execl() 函数

[...]

一旦搜索并找到一个实用程序[不带斜线调用](作为此特定搜索的结果或作为未指定的 shell 启动活动的一部分),实现可能会记住它的位置并且不需要搜索再次为实用程序提供服务


* 这就是为什么您在当前目录中使用./myfile 执行脚本的原因:这是使文件名包含斜杠的最短方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多