【问题标题】:What is the equivalent to "which" for commands that don't refer to executables?对于不引用可执行文件的命令,“which”的等价物是什么?
【发布时间】:2018-08-15 19:15:38
【问题描述】:

我试图找出特定命令是如何定义的。我检查了$PATH 的所有位置,找不到任何像我的命令一样命名的文件,所以它似乎是别的东西。

这是一个使用 nvm 的示例,它不是可执行文件:

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

which nvm 什么都不返回。

在基于 unix 的系统中,类似这样的命令的“which”是什么?

【问题讨论】:

  • 对于which,它是脚本还是可执行文件并不重要。可能是别名或函数。试试type nvm
  • 它显然不是位于您的 PATH 中的可执行脚本——如果是,which 会找到它。你所拥有的是一个函数或一个别名。
  • 哦,我不知道which 也适用于 shell/bash 文件。你说的对。 nvm 是一个函数。 type nvm 透露了。
  • (从应用程序的角度来看,使用 +x 位设置和有效的 shebang 启动脚本与启动任何其他可执行文件使用相同的操作系统界面 - 在 execv 之前实际上没有区别-family 系统调用实际上被调用;因此,which 没有可见的区别。

标签: bash shell unix terminal


【解决方案1】:

您要查找的命令是type

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

【讨论】:

    【解决方案2】:

    Here 是对一个类似问题的回答,该问题建议不要使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多