该命令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 函数。