2012-07-26 8 views
7

Czy istnieje (w pewnym stopniu) niezawodny sposób uzyskania "pochodzenia" polecenia, nawet jeśli polecenie jest aliasem? Na przykład, jeśli mogę umieścić w moim bash_profileOkreślanie, gdzie zdefiniowany jest alias UNIX

alias lsa="ls -A" 

i chciałem wiedzieć z linii poleceń, gdzie lsa jest zdefiniowany, jest to możliwe? Wiem o poleceniu which, ale nie wydaje się, aby to zrobić.

+6

Czy próbowałeś 'type'? Nie pokazuje, gdzie został zdefiniowany, ale pokazuje definicję. –

+0

@CarlNorum powinieneś po prostu udzielić takiej odpowiedzi. – kojiro

+2

@kojiro, tak naprawdę nie odpowiada na pytanie, które dotyczy * gdzie * definicja jest. Myślałem, że to będzie pomocne informacje. –

Odpowiedz

15

Jak zauważył Carl w swoim komentarzu, type jest prawidłowym sposobem sprawdzenia, jak definiuje się nazwę.

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

Funkcja ta dostarczy informacji na temat, jaki rodzaj polecenia jest to:

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 
} 

Będzie albo wypluć builtin, alias itd linię jak /bin/ls: Mach-O 64-bit x86_64 executable Jeżeli plik, albo nic jeśli nie jest obecny. Zwróci błąd w tym ostatnim przypadku.

+1

Dlaczego kiedykolwiek używałbyś 'które'? 'type' może również wyszukiwać ścieżki - patrz argument' -P'. –

1

Podczas gdy type i which wskażą Ci źródło, nie będą wyszukiwać w kilku krokach. Napisałem mały program do tego: origin. Przykład:

[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$ 
Powiązane problemy