2012-07-26 25 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$