什么是 bash 命令:`command`?

什么是 bash 命令:`command`?

该命令command没有手动输入,但帮助显示如下:

$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.
    
    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.
    
    Options:
      -p    use a default value for PATH that is guaranteed to find all of
        the standard utilities
      -v    print a description of COMMAND similar to the `type' builtin
      -V    print a more verbose description of each COMMAND
    
    Exit Status:
    Returns exit status of COMMAND, or failure if COMMAND is not found.

问题

  • 可以command -v替代吗which
  • 的目的和用途是什么command

答案1

command是一个 bash内置我们可以看到:

seth@host:~$ type command
command is a shell builtin

所以我们知道command它是由我们的 shell bash 提供的。深入研究后,man bash我们可以看到它的用途:

(从man bash):

command [-pVv] command [arg ...]
              Run  command  with  args  suppressing  the normal shell function
              lookup. Only builtin commands or commands found in the PATH  are
              executed.   If the -p option is given, the search for command is
              performed using a default value for PATH that is  guaranteed  to
              find  all  of  the  standard  utilities.  If either the -V or -v
              option is supplied, a description of command is printed.  The -v
              option  causes a single word indicating the command or file name
              used to invoke command to be displayed; the -V option produces a
              more  verbose  description.  If the -V or -v option is supplied,
              the exit status is 0 if command was found, and  1  if  not.   If
              neither  option  is  supplied  and  an error occurred or command
              cannot be found, the exit status is 127.   Otherwise,  the  exit
              status of the command builtin is the exit status of command.  

本质上,您可以使用command它来绕过“正常函数查找”。例如,假设您的 中有一个函数.bashrc

function say_hello() {
   echo 'Hello!'
}

通常情况下,当你在终端中运行bash 时,会找到你say_hello命名的函数say_hello.bashrc 例如,它找到了一个名为的应用程序say_hello。使用:

command say_hello  

使 bash 绕过其正常的函数查找并直接转到内置函数或你的$PATH。请注意,此函数查找包括别名。使用command将绕过函数和别名。

如果-p提供了该选项,bash 将绕过您的自定义$PATH并使用它自己的默认值。

-v或标志bash 打印命令的-V描述(缩写为-v,完整为)。-V

注意:正如 souravc 在评论中指出的那样,可以在这里找到一种更简单的查找有关 shell 内置命令的信息的方法:如何让 `man` 成为 shell 内置命令和关键字?

答案2

这是 Bash shell 的内置命令。

我认为这个内置功能的唯一优点可以总结为帮助文本

当存在同名函数时,可用于调用磁盘上的命令。

因此,如果您想执行一个程序(保存在磁盘某处的二进制文件),并且存在同名的内部 shell 函数,那么您可以使用此内置函数调用您的程序。

是的,command -v将产生与相同的结果type

我也在 Dash shell 下发现了它。

答案3

它有两种不同的用途:

一种用途是忽略别名功能,然后运行可执行文件在 PATH 中找到,即使存在同名的别名或函数。

举个例子,我将使用一个别名来ls将 a 附加/到目录名中:

$ alias ls='ls --classify'
$ ls -d .
./
$ command ls -d .
.

在交互式 shell 中,在命令名前使用反斜杠作为替代的、更短的语法可能更方便:

$ \ls -d .
.

另一个用途是查找命令当使用选项 未使用命令名称时,将运行该命令-v。它似乎是 的可移植性/POSIX 变体which

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed

答案4

它允许您运行 shell 命令而忽略任何 shell 函数。

http://ss64.com/bash/command.html

相关内容