【问题标题】:How to find directory of some command?Shell - 如何找到某些命令的目录?
【发布时间】:2011-02-21 14:00:18
【问题描述】:

我知道,当您在 shell 上时,唯一可以使用的命令是可以在 PATH 上设置的某个目录中找到的命令。 即使我不知道如何查看我的 PATH 变量上的目录(这是另一个可以回答的好问题),我想知道的是:

我来shell写:

$ lshw

我想知道 shell 上的一个命令,它可以告诉我这个命令的位置。也就是说,这个“可执行文件”在哪里?

类似:

$ location lshw
/usr/bin

有人吗?

【问题讨论】:

    标签: linux shell command-line


    【解决方案1】:

    如果您使用的是 Bash 或 zsh,请使用:

    type -a lshw
    

    这将显示目标是内置、函数、别名还是外部可执行文件。如果是后者,它将显示它出现在您的PATH 中的每个位置。

    bash$ type -a lshw
    lshw is /usr/bin/lshw
    bash$ type -a ls
    ls is aliased to `ls --color=auto'
    ls is /bin/ls
    bash$ zsh
    zsh% type -a which
    which is a shell builtin
    which is /usr/bin/which
    

    在 Bash 中,对于函数 type -a 也会显示函数定义。你可以使用declare -f functionname 来做同样的事情(你必须将它用于zsh,因为type -a 没有)。

    【讨论】:

    • 感谢所有回答的人,但这个回答是最激动人心的!谢谢!我在想我疯了,因为我(很久以前)定义了一种方法来做到这一点:'update',而这一直在做'apt-get update; apt-get dist-upgrade' 对我来说。但是现在,我试图在某个地方找到一些 update.sh 文件,但我找不到它。这就是我开始这个问题的原因。但是现在,使用“type -a update”,我发现这只是在我的 ~home 上的 .bashrc 上定义的别名。真的谢谢你。
    • @Gabriel:如果您不熟悉locate,它可以帮助您查找文件。它使用由 updatedb 维护的数据库,该数据库从 cron 作业运行。由于locate 搜索数据库而不是整个文件系统,因此它比find 快得多(可以作为最后的手段)。
    • 谢谢。我将研究这个工具,看看 updatedb 是如何安排在 Ubuntu 的 cronjob 上运行的。
    • 有时type -a 可能会令人困惑。例如如果 nvm 这是我需要做的 bash 函数:type -a nvm | head -n1 找出究竟是什么 nvm
    • @MarinosAn:对于函数,type -a 输出函数定义以及可执行文件的类型。使用head 的风险在于,如果名称具有多种类型,则不会输出其他类型。你可能想看看type -t
    【解决方案2】:

    像这样:

    which lshw
    

    要查看路径中匹配的所有命令:

    which -a lshw 
    

    【讨论】:

    • 也可以使用 which -a lshw 查看与您的路径匹配的所有命令。
    • 我相信这只适用于命令($PATH 上的可执行文件),而不适用于函数。
    • which 是有问题的,因为有多种实现,其中许多完全错误,而另一些似乎工作正常,但有一些奇怪的惊喜。你应该更喜欢type
    • 不适用于别名和 bash 函数。至少在ubuntu上。更好地使用type -a lshw
    【解决方案3】:

    PATH是环境变量,可以通过echo命令显示:

    echo $PATH
    

    这是一个由冒号字符':'分隔的路径列表

    which 命令告诉您在运行命令时执行哪个文件:

    which lshw
    

    有时你得到的是一个符号链接的路径;如果您想将该链接跟踪到实际可执行文件所在的位置,您可以使用readlink 并将which 的输出提供给它:

    readlink -f $(which lshw)
    

    -f 参数指示readlink 继续递归地跟踪符号链接。

    这是我机器上的一个例子:

    $ which firefox
    /usr/bin/firefox
    
    $ readlink -f $(which firefox)
    /usr/lib/firefox-3.6.3/firefox.sh
    

    【讨论】:

    • 对我来说 which ack 返回 ack: aliased to …,所以在脚本中不起作用。
    【解决方案4】:
    ~$ echo $PATH
    /home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    ~$ whereis lshw
    lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
    

    【讨论】:

    • 一些详细说明可能对未来的读者有所帮助:要查找二进制文件,您必须使用-b 选项,然后您可以将其与awk 结合使用以获取路径。所以,类似:whereis -b ack | awk '{print $2}'
    【解决方案5】:

    在 TENEX C Shell tcsh 中,可以列出命令的位置,或者如果它是内置命令,则使用 where 命令,例如:

    tcsh% where python
    /usr/local/bin/python
    /usr/bin/python
    
    tcsh% where cd
    cd is a shell built-in
    /usr/bin/cd
    

    【讨论】:

      【解决方案6】:

      type -a 的替代品是command -V

      由于大多数时候我只对第一个结果感兴趣,所以我也从头开始。这样一来,在 bash 函数的情况下,屏幕就不会被代码淹没。

      command -V lshw | head -n1
      

      【讨论】:

        【解决方案7】:

        TLDR 答案

        使用:whereis -b lshw

        说明

        使用whereis 命令。来自man page:

        whereis - 找到命令的二进制文件、源文件和手册页文件

        常用开关

        此外,您还可以指定要查找的内容:

        • whereis -b packagename:二进制文件位置的来源。
        • whereis -m packagename:手册位置来源。
        • whereis -s packagename :源代码位置的来源。

        在您的情况下,由于您正在寻找二进制文件,因此您需要:whereis -b lshw

        此命令还有其他开关,请在man page. 处查看它们。如果没有与包名关联的文件,您将看到一个空行。

        示例

        这是一些现实世界的使用:

        holdoffhunger@tower:~$ whereis grep
        grep: /bin/grep /usr/share/man/man1/grep.1.gz /usr/share/man/man1/grep.1posix.gz
        
        holdoffhunger@tower:~$ whereis -m grep
        grep: /usr/share/man/man1/grep.1.gz /usr/share/man/man1/grep.1posix.gz
        
        holdoffhunger@tower:~$ whereis -s grep
        grep:
        

        【讨论】:

          【解决方案8】:

          Korn shell ksh 提供了 whence 内置函数,它可以识别其他 shell 内置函数、宏等。不过,which 命令更便于移植。

          【讨论】:

          • 在 ksh 中,whence -a 类似于 Bash 的 type -a
          猜你喜欢
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          相关资源
          最近更新 更多