Что такое команда: `command`?

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

Какие аргументы принимаются этой командой, а . [F3] является альтернативой which?

1
задан 25 January 2016 в 03:36

4 ответа

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

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

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

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

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

Я нашел его также под оболочкой Dash.

13
ответ дан 24 May 2018 в 04:32
  • 1
    То, что стоит добавить более явно, состоит в том, что, хотя command (name) игнорирует функции оболочки, command -v (name) этого не делает. Предполагается, что command -v (name) >/dev/null является переносным способом проверки наличия команды с этим именем независимо от того, является ли она встроенной оболочкой, функцией или внешней утилитой. – hvd 18 August 2014 в 16:49
  • 2
    команда -v является альтернативой posix, которой, тип и т. д., stackoverflow.com/questions/762631/… – Javier López 18 August 2014 в 18:23
  • 3
    Для реального примера, среда сборки Android AOSP (в некоторый момент после v4.2.2) определяет функцию оболочки с именем «make», которая выплевывает информацию о том, удастся ли построить сборку и сколько времени она занимает. Другие функции оболочки в среде сборки AOSP используют command make для вызова программы фактического фактического создания. К сожалению, у меня есть другие сценарии оболочки, которые сломались, когда среда AOSP начала добавлять дерьмо к тому, что выводила программа make, и было очень неприятно, когда выяснилось, откуда таинственный выход был таинственным. – Michael Burr 21 March 2017 в 03:20

Он имеет два разных назначения:

. Одно использование - игнорировать псевдонимы и функции и запускать исполняемый файл, найденный в PATH, даже если существует псевдоним или функция с тем же именем. [!d1 ]

В качестве примера я буду использовать псевдоним для ls, который добавляет имена / к каталогам:

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

В интерактивной оболочке может быть удобнее использовать обратная косая черта перед именем команды как альтернатива, более короткий синтаксис:

$ \ls -d .
.

Другое использование - aliases , которое будет выполняться, когда имя команды не будет использоваться с помощью опции -v. Кажется, это самый портативный / POSIX-вариант which.

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
6
ответ дан 24 May 2018 в 04:32

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

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

2
ответ дан 24 May 2018 в 04:32

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
1
ответ дан 24 May 2018 в 04:32

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

Похожие вопросы: