Какая польза от команды: `команда`?

Недавно я нашел команду: 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

Это позволяет вам запускать команду оболочки, игнорируя любые функции оболочки.

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

Я видел, как используется в качестве метода для передачи аргументов командной строки исполняемым файлам, которые необходимо запускать как фоновый процесс. Вот пример, найденный в сети

command ping -i 5 google.com &

https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes#starting-processes

Другие вопросы по тегам