2011-05-13 6 views
6

Pracuję nad małą aplikacją opartą na ffmpeg, a ja czytam numer tutorial made for ubuntu, w którym radzą użyć komendy hash w produkowanym pliku wykonywalnym.Używanie polecenia "hash"

Jestem ciekawy tego polecenia, czy kiedykolwiek go używałeś? W jakim celu?

Kiedy uruchomić go w moim folderze źródłowym, mam to (raz skompilowany)

$ 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 

Wygląda na podsumowanie mojego bash_history ...

Kiedy uruchamiam go na plik wykonywalny, robię nie wyświetla się wiele linii i nic nie zmienia się w tej aplikacji?

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

Kiedy szukam mężczyzny, to po prostu mówi, że jest to funkcja wbudowana. Naprawdę użyteczne :)

To działa (powiedzmy istnieje) na Linuksie i na MacOSX.

Dzięki za pomoc, będę prawdopodobnie dowiedzieć się czegoś dzisiaj :)

Odpowiedz

8

hash rzeczywistości nie jest historia; to bash(1) shell wbudowaną że utrzymuje tablicę hash niedawno zrealizowanych programów: (. Od 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. 

Przewodnik swój znaleźć można sugerują uruchomienie go po prostu zobaczyć któraffmpeg polecenie miało zostać wykonane w następnym kroku; być może istnieje program ffmpeg dostarczany przez opakowanie dystrybucyjne, i chcieli upewnić się, że nowy zostanie wykonany zamiast dostarczonego przez distro, jeśli po prostu wpiszesz w powłoce ffmpeg.

Wydaje odcinek, bo to byłoby również wymaga posiadania katalog zawierający nową ffmpeg w PATHprzed wersję dystrybucji, pod warunkiem, i nie ma gwarancji, iż.

+0

Cool, dzięki ... I nadal nie rozumiem, dlaczego należy to wykorzystać po kompilacji, bo zwykle nie skompilować w $ PATH. – Rob

+1

@Rob, zgodził się, wydaje mi się to dziwne. Wydaje mi się, że w ciągu piętnastu lub szesnastu lat używałem systemów uniksowych lub systemowych Linuxa, a to mogło być spowodowane moim niedoświadczeniem w tym czasie. – sarnold

+0

Zobacz także http://unix.stackexchange.com/questions/86012/what-is-the- purpose-of-the-hash-command –

6

Jeśli używasz poleceń, które mogą nie być zainstalowane w systemie, sprawdź ich dostępność i powiedz użytkownikowi, czego brakuje. Od Scripting with style

Przykład:

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