2012-07-26 62 views
7

即使命令是別名,是否存在(某種程度上)可靠的方法來獲取命令的「原點」?例如,如果我把這個在我的.bash_profile確定UNIX別名的定義位置

alias lsa="ls -A" 

,我想在命令行,其中lsa定義就知道了,這可能嗎?我知道which命令,但似乎並沒有這樣做。

+6

你試過'type'嗎?它沒有顯示它被定義的位置,但確實顯示了定義。 – 2012-07-26 01:08:41

+0

@CarlNorum你應該真的只是做出答案。 – kojiro 2012-07-26 01:20:39

+2

@kojiro,它並沒有真正回答這個問題,它是關於*定義在哪裏的。不過,我認爲這將是有用的信息。 – 2012-07-26 01:37:16

回答

15

正如卡爾在他的評論中指出的,type是找出名稱是如何定義的正確方法。

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

此功能將與它是什麼類型的命令信息提供:

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 
} 

它要麼吐出builtinalias等,這行/bin/ls: Mach-O 64-bit x86_64 executable如果一個文件,或者什麼如果不存在。它會在最後一種情況下返回一個錯誤。

+1

你爲什麼會用'which'? 'type'也可以進行路徑查找 - 參見'-P'參數。 – 2016-09-05 20:09:20

1

雖然typewhich會告訴你的來源,他們不查找幾個步驟。我爲此寫了一個小程序:origin。舉個例子:

[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$