2011-05-13 10 views
6

私はffmpegに基づいた小さなアプリを開発しています。tutorial made for ubuntuを読んで、hashというコマンドを使用して生成された実行可能ファイルに書き込むことをお勧めします。'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上(を存在するとしましょう)動作しません。あなたの助けのための

おかげで、私はおそらく今日何かを学びます:)

答えて

8

hashは実際にあなたの歴史ではありません。それが最近、実行されるプログラムのハッシュテーブルを維持bash(1)シェル組み込みです(。bash(1)から)

Bash uses a hash table to remember the full pathnames of 
    executable files (see hash under SHELL BUILTIN COMMANDS 
    below). A full search of the directories in PATH is 
    performed only if the command is not found in the hash table. 

ガイドがあなたのことを実行している示唆している可能性が見つかっただけでffmpegを参照してくださいコマンドは次のステップで実行される予定でした。おそらく、配布パッケージによって提供されるffmpegプログラムがあり、シェルでffmpegと入力した場合は、ディストリビューションの代わりに新しいものが実行されることを確認したかったでしょう。それはが前に、ディストリビューションが提供するバージョンをPATHで新しいffmpegを含むディレクトリを持つ必要になるので

それは、ストレッチをようで、その保証はありません。

+0

クール、おかげで...私は通常、$ PATHにコンパイルされませんので、私は、コンパイル後にこれを使用する必要があり、なぜ私はまだ得ることはありません。 – Rob

+1

@Robが同意した、それは私には奇妙に思える。私はUnixやLinuxシステムを使っていた15年や16年の間に一度ハッシュしてしまったと思っています。それは当時の私の未熟さのせいかもしれません。 – sarnold

+0

http://unix.stackexchange.com/questions/86012/what-is-the-purpose-of-the-hash-commandも参照してください。 –

6

システムにインストールされていない可能性のあるコマンドを使用する場合は、その可用性をチェックし、不足しているものをユーザーに伝えます。 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