Какая польза от команды: `команда`?
Недавно я нашел команду: 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
?
6 ответов
command
это встроенный bash, как мы можем видеть:
seth@host:~$ type command
command is a shell builtin
Итак, мы знаем command
обеспечивается нашей оболочкой, 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
или же -V
флаги Bash печатает описание (сокращение от -v
, долго для -V
) команды.
Примечание. Как указывал souravc в комментариях, более простой метод поиска информации о встроенных командах оболочки можно найти здесь: Как заставить `man` работать для встроенных команд оболочки и ключевых слов?
Это встроенная команда оболочки Bash.
Единственное преимущество, которое я вижу с этой встроенной функцией, суммировано в следующем предложении текста справки:
Can be used to invoke commands on disk when a function with the same name exists
Поэтому, если вы хотите выполнить программу (бинарный файл, сохраненный на вашем диске), и существует внутренняя функция оболочки с таким же именем, вы можете вызвать вашу программу, используя эту встроенную функцию.
И да, command -v
даст тот же результат, что и type
,
Я нашел это также под панелью Dash.
У этого есть два различных использования:
Одно из применений - игнорировать псевдонимы и функции и запускать исполняемый файл, найденный в PATH, даже если псевдоним или функция с тем же именем существует.
Как пример, я буду использовать псевдоним для ls
который добавляет /
в имена каталогов:
$ alias ls='ls --classify'
$ ls -d .
./
$ command ls -d .
.
В интерактивной оболочке может быть удобнее использовать обратную косую черту перед именем команды в качестве альтернативы с более коротким синтаксисом:
$ \ls -d .
.
Другое использование - найти команду, которая будет выполняться, когда имя команды не используется, с помощью опции -v
, Кажется, это самый переносимый /POSIX вариант which
,
$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
command
полезно, например, если вы хотите проверить существование конкретной команды. which
включает псевдонимы в поиск, поэтому он не подходит для этой цели, поскольку вы не хотите, чтобы случайный псевдоним рассматривался как рассматриваемая команда.
Другими словами, вы можете иметь небольшую функцию в сценарии оболочки, например:
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
Это позволяет вам запускать команду оболочки, игнорируя любые функции оболочки.
Я видел, как используется в качестве метода для передачи аргументов командной строки исполняемым файлам, которые необходимо запускать как фоновый процесс. Вот пример, найденный в сети
command ping -i 5 google.com &