Яке використання команди: `команда '?


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?

Відповіді:


44

commandє Баш вбудованої , як ми можемо бачити:

seth@host:~$ type command
command is a shell builtin

Отже, ми знаємо, що commandце забезпечено нашою оболонкою, Баш. Покопившись, 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прапори Баш друкує опису (скорочено -v, довго -V) команди.

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


1
Подивіться також на thsi
souravc

@souravc Це смішно, у мене немає commandмашини для моєї сторінки.
Сет

2
спробуйте sudo apt-get install manpages-posix. Він не встановлений за замовчуванням. дивіться тут
souravc

@souravc Дуже добре! Я відредагую це посилання у відповідь.
Сет

1
@ Норі-чан Баш - оболонка Ubuntu за замовчуванням . Це те, що інтерпретує команди, які ви вводите, і вирішує, що робити і як це зробити з інформацією, яку ви вводите. Вивчаючи командний рядок Un * x, ви (певним чином) вивчаєте баш :)
Сет,

14

Це вбудована команда оболонки Bash.

Єдина перевага, яку я бачу за допомогою цього вбудованого, узагальнена у наступному реченні довідкового тексту:

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

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

І так, command -vдасть такий самий результат, як і type.

Я знайшов це також під оболонкою Даш.


1
Що варто додати більш чітко, це те, що, хоча command (name)ігнорує функції оболонки, command -v (name)це не робить. command -v (name) >/dev/nullповинен бути портативним способом перевірити, чи існує команда з цим ім'ям, незалежно від того, чи є вбудована оболонка, функція чи зовнішня утиліта.
hvd

1
команда -v - це позиційна альтернатива, введіть тощо, stackoverflow.com/questions/762631/…
Хав'єр Лопес

На прикладі реального світу середовище побудови Android AOSP (в якийсь момент після версії 4.2) визначає функцію оболонки під назвою "make", яка випльовує інформацію про те, чи вдала збірка і скільки часу це зайняло. Інші функції оболонки в середовищі побудови AOSP використовують command 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.