2011-05-13 31 views
6

Estoy trabajando en una aplicación pequeña basada en ffmpeg, y leí un tutorial made for ubuntu donde recomiendan usar el comando hash en el ejecutable producido.Uso del comando 'hash'

Tengo curiosidad acerca de ese comando, ¿alguna vez lo usaste? Para qué propósito?

Cuando lo ejecuto en mi carpeta de origen, me sale esto (una vez compilado)

$ 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 

Parece un resumen de mi Bash_history ...

Cuando ejecuto en un archivo ejecutable, que hago no se muestran muchas líneas, y nada parece cambiar en esa aplicación?

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

Cuando busco al hombre, solo dice que es una función incorporada. Realmente útil :)

Funciona (digamos exist) en Linux y en MacOSX.

Gracias por su ayuda, probablemente voy a aprender algo hoy :)

Respuesta

8

hash no es realmente su historia; es un sistema incorporado en bash(1) cáscara que mantiene una tabla hash de los programas recientemente ejecutados: (. Desde 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. 

La guía de tu encontrado pueden haber sugerido corriendo sólo para ver cualesffmpeg comando iba a ser ejecutado por el siguiente paso; tal vez haya un programa ffmpeg suministrado por el paquete de distribución, y querían asegurarse de que se ejecutara el nuevo en lugar del distribuido, si acabas de escribir ffmpeg en el shell.

Parece un tramo, porque sería también requiere tener el directorio que contiene el nuevo ffmpeg en el PATH antes de la versión de distribución proporcionados, y no hay garantía de ello.

+0

fresca, gracias ... Todavía no entiendo por qué debería usar esto después de una compilación, porque por lo general no compilan en $ PATH. – Rob

+1

@Rob, de acuerdo, me parece extraño. Creo que he necesitado _ hash_ una vez en los quince o dieciséis años que llevo usando sistemas Unix o Linux, y eso podría deberse a mi inexperiencia en ese momento. – sarnold

+0

Véase también http://unix.stackexchange.com/questions/86012/what-is-the-purpose-of-the-hash-command –

6

Si utiliza comandos que pueden no estar instalados en el sistema, verifique su disponibilidad y diga al usuario lo que falta. De Scripting with style

Ejemplo:

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