【问题标题】:Use of the 'hash' command使用“哈希”命令
【发布时间】:2011-08-24 15:39:53
【问题描述】:

我正在开发一个基于 ffmpeg 的小型应用程序,我阅读了 tutorial made for ubuntu,他们建议在生成的可执行文件上使用命令 hash

我很好奇那个命令,你用过吗?目的是什么?

当我在我的源文件夹中运行它时,我得到了这个(一旦编译)

$ hash
hits    command
   1    /usr/bin/strip
   1    /usr/local/bin/ffmpeg
   1    /usr/bin/svn
   4    /usr/local/bin/brew
   2    /usr/bin/git
   1    /bin/rm
   1    /bin/cat
   1    /usr/bin/ld
   1    /bin/sh
   4    /usr/bin/man
   5    /usr/bin/make
   4    /usr/bin/otool
  15    /bin/ls
   6    /usr/bin/open
   2    /usr/bin/clear

看起来像是我的 bash_history 的总结……

当我在一个可执行文件上运行它时,我没有显示很多行,并且该应用程序似乎没有任何变化?

$ md5 ffserver
MD5 (ffserver) = 2beac612e5efd6ee4a827ae0893ee338
$ hash ffserver
$ md5 ffserver
MD5 (ffserver) = 2beac612e5efd6ee4a827ae0893ee338

当我寻找这个人时,它只是说它是一个内置函数。真的很有用:)

它在 Linux 和 MacOSX 上确实有效(比如说存在)。

【问题讨论】:

    标签: bash hash ffmpeg


    【解决方案1】:

    hash 实际上并不是你的历史;它是一个内置的bash(1) shell,用于维护最近执行的程序的哈希表:

    Bash 使用哈希表来记住可执行文件的完整路径名(请参阅下面的 SHELL BUILTIN COMMANDS 下的哈希)。只有在哈希表中找不到该命令时,才会对 PATH 中的目录进行完整搜索。

    (来自bash(1)。)

    您找到的指南可能建议运行它只是为了查看哪个 ffmpeg 命令将在下一步执行;也许分发包提供了一个ffmpeg 程序,如果您只是在shell 中键入ffmpeg,他们希望确保执行新程序而不是发行版提供的程序。

    这似乎有点牵强,因为它还需要在发行版提供的版本之前PATH 中拥有包含新ffmpeg 的目录,并且有不能保证。

    【讨论】:

    • 酷,谢谢...我仍然不明白为什么我应该在编译后使用它,因为我通常不在 $PATH 中编译。
    • @Rob,同意,这对我来说似乎很奇怪。我想在我使用 Unix 或 Linux 系统的 15 或 16 年中,我需要一次哈希,这可能只是由于我当时缺乏经验。
    • 我是上述教程的主要作者并添加了hash 命令(虽然它应该是hash -d ffmpeg,而不是hash -r shotgun 方法)。那是几年前的事了,但如果我没记错的话,一些用户遇到了一个不常见的极端情况,即执行发行版ffmpeg 而不是新编译的ffmpeg,尽管两者都在PATH 中。我不记得确切的细节并且忘记了如何重现该行为(我记得它很容易重现),但发出 hash 阻止/解决了它。我得再看一遍。
    • @lllogan,我还是更喜欢hash -r,因为 (a) 输入更少 (b) 重新学习到其他命令的路径实际上并不那么昂贵。
    【解决方案2】:

    如果您使用系统上可能未安装的命令,请检查它们的可用性并告诉用户缺少什么。来自Scripting with style

    例子:

    NEEDED_COMMANDS="sed awk lsof who"
    
    missing_counter=0
    for needed_command in $NEEDED_COMMANDS; do
      if ! hash "$needed_command" >/dev/null 2>&1; then
        printf "Command not found in PATH: %s\n" "$needed_command" >&2
        ((missing_counter++))
      fi
    done
    
    if ((missing_counter > 0)); then
      printf "Minimum %d commands are missing in PATH, aborting" "$missing_counter" >&2
      exit 1
    fi
    

    【讨论】:

      猜你喜欢
      • 2019-05-25
      • 2014-09-08
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多