如何找到命令行操作的来源?

如何找到命令行操作的来源?

假设我能够abc在命令行中输入并且它就会运行(因此 shell 不会说“abc:未找到命令”)。

我如何才能知道它abc是什么或做什么?它是脚本吗?程序?别名?

答案1

您可以使用type命令,例如type abc。例如,在 bash shell 中:

$ type while cd ls gcc apt
while is a shell keyword
cd is a shell builtin
ls is aliased to `ls --color=auto'
gcc is /usr/bin/gcc
apt is hashed (/usr/bin/apt)

普通type命令仅显示第一个结果。如果abc的不同位置有 的多个版本PATH,或者abc既是 shell 关键字又是外部可执行文件,或者要查看命令的别名版本和非别名版本,则可以使用type -a列出所有这些版本,例如:

$ type -a time
time is a shell keyword
time is /usr/bin/time

$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

$ type -a datamash
datamash is /usr/local/bin/datamash
datamash is /usr/bin/datamash

在 bash 中,type它本身就是一个 shell 内置命令。其他 shell(如zshksh以及dash(在 Ubuntu 中提供/bin/sh))提供类似的功能(尽管dash目前不提供type -a)。在 中tcsh,最接近的等价命令是内置which命令 - 不要与外部命令混淆which- 请参阅为什么不使用“which”?那么用什么呢?

对于被标识为外部程序的命令(即具有路径,如/usr/bin/gcc),您可以使用该file命令来找出程序的类型:

$ file /bin/ls /usr/bin/gcc /usr/sbin/adduser
/bin/ls:           ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2f15ad836be3339dec0e2e6a3c637e08e48aacbd, for GNU/Linux 3.2.0, stripped
/usr/bin/gcc:      symbolic link to gcc-9
/usr/sbin/adduser: Perl script text executable

答案2

对于已安装的命令,请使用steeldriver的答案。

对于未安装的命令,请参阅下文。

有一个特殊的包名为command-not-found. 其目的是

在交互式 bash 会话中建议安装软件包

一旦安装,该包将完成其工作并建议您安装具有已知可执行文件名称的 deb 包。


如果您知道可执行文件名称和/或其部分文件路径,那么您可以使用以下两个选项之一找到它的包:

  • 本地apt-file

    sudo apt-get install apt-file
    sudo apt-file update
    apt-file search bin/htop
    

    得到类似的东西

    htop: /usr/bin/htop
    
  • 在线使用包裹内容搜索https://packages.ubuntu.com- 查看结果此链接

答案3

还有其他几种可能性:

which abc

将返回系统中程序 abc 的位置。

例如,

which cat
/bin/cat

如果你的程序 abc 附带了一些文档,则可以通过运行以下命令找到有关它的更多信息

man abc

这将向您显示此程序的手册页(如果有)。您可以了解有关其用法、命令行选项和参数的更多信息。您甚至可能会找到如何使用 abc 的示例或维护人员维护程序的网页。

一个可以替代 man 或手册页的实用程序是名为 info 的实用程序。一些程序维护者希望使用 info 为您提供与 man 页面相同或类似的内容。

info abc

例如将向您展示可以提供什么帮助。

由于您提到了别名,您可以使用 alias 命令显示别名及其定义

alias

以下是我的 Ubuntu 20.04 机器上的示例输出

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echoterminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

答案4

假设我能够abc在命令行中输入任何事物但返回

abc:未找到命令

我如何才能知道它abc是什么或做什么?它是脚本吗?程序?别名?

以上都不是。如果找不到,则什么都不是。您可以创建或安装(或添加到搜索路径)名为 的脚本、程序或别名abc,那么它将是脚本、程序或别名。但目前,它什么都不是。

相关内容