对于不引用可执行文件的命令,“which”相当于什么?

时间:2018-03-07 15:53:12

标签: bash shell unix terminal

我正在尝试找出如何定义特定命令。我检查了$PATH的所有位置,找不到任何名为my command的文件,所以它似乎是其他的。

以下是使用nvm的示例,它不是可执行文件:

me@MacBook:~$ which cat
/bin/cat
me@MacBook:~$ which nvm
me@MacBook:~$ nvm --version
0.33.8

which nvm根本不返回任何内容。

在基于unix的系统中,这样的命令的“which”相当于什么?

2 个答案:

答案 0 :(得分:7)

您要查找的命令是type

type nvm将显示shell将如何解释命令,因此与which不同,它还会显示别名,函数和未导出的路径。

答案 1 :(得分:3)

Here是对simiar问题的回答,该问题建议不要使用which,原因与此问题无关。

那就是说,你假设which只能看到可执行文件是错误的。

但是,默认情况下它不会看到函数和别名。

这就是为什么手册页上写着:

  

使用此实用程序的推荐方法是添加别名(C shell)或shell函数(Bourne          shell),如下所示:

   [ba]sh:
        which () {
          (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@
        }
        export -f which

如果您在.bashrc中定义此功能并重新获取,则应该可以

which -a

它也应该为你提供函数和别名。

但是,请注意,如果某个配置文件或bashrc已经为which定义了一些优先级(您可以通过type -a which btw找到它。)

如果我定义了一个名为something的脚本,一个函数和一个别名type -a

type -a something
something is aliased to `echo "something"'
something is a function
something () 
{ 
    echo "function something"
}    
something is /home/myself/bin/something

创建函数后which -a给我:

which -a something
alias something='echo "something"'
   /usr/bin/echo
   /bin/echo
something ()
{ 
    echo "function something"
}
~/bin/something