2012-07-26 14 views
7

¿Existe alguna forma (un tanto) confiable de obtener el 'origen' de un comando, incluso si el comando es un alias? Por ejemplo, si pongo esto en mi .bash_profileDetermine dónde se define un alias de UNIX

alias lsa="ls -A" 

y quería saber desde la línea de comandos, donde se define lsa, es posible? Sé sobre el comando which, pero parece que no lo hace.

+6

¿Ha intentado 'type'? No muestra dónde se definió, pero muestra la definición. –

+0

@CarlNorum realmente deberías hacer una respuesta. – kojiro

+2

@kojiro, realmente no responde la pregunta, que trata de * donde * es la definición. Pensé que sería información útil, sin embargo. –

Respuesta

15

Como señaló Carl en su comentario, type es la forma correcta de descubrir cómo se define un nombre.

mini:~ michael$ alias foo='echo bar' 
mini:~ michael$ biz() { echo bar; } 
mini:~ michael$ type foo 
foo is aliased to `echo bar' 
mini:~ michael$ type biz 
biz is a function 
biz() 
{ 
    echo bar 
} 
mini:~ michael$ type [[ 
[[ is a shell keyword 
mini:~ michael$ type printf 
printf is a shell builtin 
mini:~ michael$ type $(type -P printf) 
/usr/bin/printf is /usr/bin/printf 
0

Esta función le proporcionará información sobre qué tipo de comando es:

ft() { 
    t="$(type -t "$1")"; 
    if [ "$t" = "file" ]; then 
     if which -s "$1"; then 
      file "$(which "$1")" 
     else 
      return 1 
     fi 
    else 
     echo $t 
    fi 
    return 0 
} 

Será bien escupir builtin, alias, etc., una línea como /bin/ls: Mach-O 64-bit x86_64 executable si un archivo, o nada si no está presente Devolverá un error en ese último caso.

+1

¿Por qué alguna vez usarías 'which'? 'type' también puede hacer búsquedas de rutas: vea el argumento' -P'. –

1

Mientras type y which le indicarán la fuente, no miran hacia arriba en varios pasos. Escribí un pequeño programa para esto: origin. Un ejemplo:

[email protected]:~/projects/origin$ ./origin ll 
'll' is an alias for 'ls' in shell '/bin/bash': 'ls -alF' 
'ls' is an alias for 'ls' in shell '/bin/bash': 'ls --color=auto' 
'ls' found in PATH as '/bin/ls' 
'/bin/ls' is an executable 
[email protected]:~/projects/origin$ 
Cuestiones relacionadas