使用'hash'命令

问题描述 投票:6回答:2

我正在开发一个基于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
2个回答
11
投票

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

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

(来自bash(1)。)

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

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


9
投票

如果您使用可能未安装在系统上的命令,请检查其可用性并告诉用户缺少什么。来自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
© www.soinside.com 2019 - 2024. All rights reserved.