command:`command`的用途是什么?


34

最近,我找到了命令: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

Answers:


44

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!'
}

通常,当您say_hello在终端中运行时,bash会在找到之前say_hello中命名的函数,例如名为的应用程序。使用方法: .bashrc say_hello

command say_hello  

使bash绕过其正常功能查找,并直接进入内置程序或您的$PATH。请注意,此函数查找包括别名。使用command将绕过函数和别名。

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

-v-Vbash的打印的说明(以下简称标志-v,长-V)的命令的。

注意:正如souravc在评论中指出的,可以在这里找到一种更简单的方法来查找有关shell内置程序的信息:如何使`man`对shell内置命令和关键字起作用?


1
另请参见thsi
souravc

@souravc很好笑,command我的机器上没有联机帮助页。
塞思2014年

2
尝试一下sudo apt-get install manpages-posix。默认情况下未安装。看这里
souravc

@souravc很好!我将把该链接编辑成答案。
赛斯2014年

1
@ Nori-chan Bash是Ubuntu的默认shell。它是解释输入的命令并根据输入的信息决定如何执行以及如何执行的事情。通过学习Un * x命令行,您(某种程度上)正在学习bash :)
Seth

14

这是Bash shell的内置命令。

帮助文本的以下句子概括了我看到的内置组件的唯一优点:

Can be used to invoke commands on disk when a function with the same name exists

因此,如果您要执行一个程序(磁盘上保存的一个二进制文件),并且存在一个具有相同名称的内部Shell函数,则可以使用此内置函数来调用您的程序。

是的,command -v将给出与相同的结果type

我也在Dash shell下找到了它。


1
值得更明确地添加的是,尽管command (name)忽略了外壳函数,但实际上command -v (name)并没有。command -v (name) >/dev/null不管它是内置的shell,函数还是外部实用程序,都应该被视为检查具有该名称的命令是否存在的便携式方法。
2014年

1
命令-v是posix的替代品,类型,等等,stackoverflow.com
JavierLópez2014年

对于一个真实的示例,Android AOSP构建环境(在v4.2.2之后的某个时刻)定义了一个名为“ make”的shell函数,该函数将吐出有关构建是否成功以及花费了多长时间的信息。AOSP构建环境中的其他shell函数command make用于调用实际的make程序。不幸的是,当AOSP环境开始在make程序输出中添加内容时,我有其他shell脚本崩溃了,这使我很恼火,因为它搞清楚了神秘的额外输出是从哪里来的。
Michael Burr

6

它有两种不同的用法:

一种用途是忽略别名函数,即使存在别名或具有相同名称的函数,也可以运行在PATH中找到的可执行文件

作为示例,我将使用一个别名来ls将a附加/到目录名称:

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

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

$ \ls -d .
.

另一个用途是通过使用option 查找未使用命令名称时要运行的命令-v。它似乎是的最便携式/ POSIX变体which

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

4

command很有用,例如,如果您要检查特定命令的存在。which在查询中包含别名,因此不适合用于此目的,因为您不希望将随机别名视为相关命令。

换句话说,在shell脚本中可以有一个小的函数,如下所示:

exists() {
  command -v "$1" >/dev/null 2>&1
}

然后测试可用命令(此处为dialog),如下所示:

if ! exists dialog ; then
   echo "This script requires 'dialog'."
   echo "Install it with 'sudo apt-get install dialog', then try again!"
   exit 1
fi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.