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

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?

Pandya
источник

Ответы:

44

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настройки и использует их по умолчанию.

Команды -vor -Vflags bash выводят описание (короткое для -v, длинное для -V) команды.

Примечание. Как указывал souravc в комментариях, более простой метод поиска информации о встроенных командах оболочки можно найти здесь: Как заставить `man` работать для встроенных команд оболочки и ключевых слов?

Сет
источник
1
Также посмотрите на это
Souravc
@souravc Забавно, у меня нет man-страницы для commandмоей машины.
Сет
2
попробуй sudo apt-get install manpages-posix. Он не установлен по умолчанию. смотрите здесь
souravc
@souravc Очень хорошо! Я отредактирую эту ссылку в ответе.
Сет
1
@ Nori-chan Bash - оболочка Ubuntu по умолчанию . Это то, что интерпретирует введенные вами команды и решает, что и как делать с вводимой вами информацией. Изучая командную строку Un * x, вы (в некотором смысле) изучаете bash :)
Сет
14

Это встроенная команда оболочки Bash.

Единственное преимущество, которое я вижу с этой встроенной функцией, суммировано в следующем предложении текста справки:

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

Поэтому, если вы хотите выполнить программу (бинарный файл, сохраненный на вашем диске), и существует внутренняя функция оболочки с таким же именем, вы можете вызвать вашу программу, используя эту встроенную функцию.

И да, command -vдаст такой же результат, как и type.

Я нашел это также под панелью Dash.

Benoit
источник
1
Что стоит добавить более явно, так это то, что, хотя command (name)игнорирует функции оболочки, command -v (name)это не так. command -v (name) >/dev/nullПредполагается, что это переносной способ проверки существования команды с таким именем независимо от того, встроена ли она в оболочку, функция или внешняя утилита.
HVd
1
Команда -v - это альтернатива posix, для которой, введите и т. д. stackoverflow.com/questions/762631/…
Хавьер Лопес
В качестве реального примера среда сборки Android AOSP (в какой-то момент после v4.2.2) определяет функцию оболочки с именем 'make', которая выдаст информацию о том, удалась ли сборка и сколько времени это заняло. Другие функции оболочки в среде сборки AOSP используют command makeдля вызова фактической программы make. К сожалению, у меня есть другие сценарии оболочки, которые сломались, когда среда AOSP начала добавлять дерьмо к тому, что makeвыводит программа, и это чертовски раздражало, когда я выясняла, откуда этот дополнительный вывод таинственным образом поступает.
Майкл Берр
6

У этого есть два различных использования:

Одно из применений - игнорировать псевдонимы и функции и запускать исполняемый файл, найденный в 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
Volker Siegel
источник
4

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
Виль
источник