Do czego służy polecenie: `polecenie`?

34

Ostatnio znalazłem polecenie: commandktóre nie ma ręcznego wprowadzania, ale pomoc wyświetla się następująco:

$ 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.

Czy command -vjest alternatywą which?

Jakie argumenty są akceptowane przez to polecenie i jak / kiedy ich używać command?

Pandya
źródło

Odpowiedzi:

44

commandto wbudowane bash, jak widzimy:

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

Więc wiemy, że commandjest dostarczany przez naszą powłokę, bash. Zagłębiając się man bash, możemy zobaczyć, jakie jest jego zastosowanie:

(z 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.  

Zasadniczo użyłbyś commanddo ominięcia „normalnego wyszukiwania funkcji”. Załóżmy na przykład, że masz funkcję w .bashrc:

function say_hello() {
   echo 'Hello!'
}

Zwykle po uruchomieniu say_hellow terminalu bash znalazłby funkcję o nazwie say_hellow niej, .bashrc zanim znalazłaby, powiedzmy, aplikację o nazwie say_hello. Za pomocą:

command say_hello  

sprawia, że ​​bash omija normalne wyszukiwanie funkcji i przechodzi bezpośrednio do wbudowanych lub twoich $PATH. Pamiętaj, że to wyszukiwanie funkcji obejmuje również aliasy. Użycie commandspowoduje pominięcie zarówno funkcji, jak i aliasów.

Jeśli -popcja jest podana, bash omija Twój zwyczaj $PATHi używa własnych ustawień domyślnych.

-vLub -Vflagi bash wypisuje opis (skrót -v, długo -V) polecenia.

Uwaga: Jak zauważył souravc w komentarzach, łatwiejszą metodę wyszukiwania informacji o wbudowanych powłokach można znaleźć tutaj: Jak sprawić, by `man` działał dla wbudowanych poleceń i słów kluczowych powłoki?

Seth
źródło
1
Również spojrzeć thsi
souravc
@souravc To zabawne, nie mam strony commandna mojej maszynie.
Seth
2
spróbuj sudo apt-get install manpages-posix. Nie jest domyślnie instalowany. spójrz tutaj
souravc,
@souravc Bardzo dobrze! Zmienię ten link do odpowiedzi.
Seth
1
@ Nori-chan Bash jest domyślną powłoką Ubuntu . To jest to, co interpretuje wprowadzane polecenia i decyduje, co robić i jak to zrobić z wprowadzonymi informacjami. Ucząc się wiersza poleceń Un * x uczysz się (w pewnym sensie) bash :)
Seth
14

Jest to wbudowane polecenie powłoki Bash.

Jedyną zaletą, którą widzę z tym wbudowanym narzędziem, jest podsumowane w następującym zdaniu tekstu pomocy:

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

Jeśli więc chcesz uruchomić program (plik binarny zapisany na niektórych dyskach) i istnieje funkcja powłoki wewnętrznej o tej samej nazwie, możesz wywołać swój program za pomocą tego wbudowanego.

I tak, command -vda taki sam wynik jak type.

Znalazłem to również pod powłoką Dash.

Benoit
źródło
1
Warto dodać bardziej wyraźnie, że chociaż command (name)ignoruje funkcje powłoki, command -v (name)nie robi tego. command -v (name) >/dev/nullma być przenośnym sposobem sprawdzania, czy komenda o takiej nazwie istnieje, niezależnie od tego, czy jest to wbudowana powłoka, funkcja czy narzędzie zewnętrzne.
hvd
1
polecenie -v to alternatywa dla posix, do której wpisz, etc, stackoverflow.com/questions/762631/…
Javier López
Na przykład w świecie rzeczywistym środowisko kompilacji AOSP dla systemu Android (w pewnym momencie po wersji 4.2.2) definiuje funkcję powłoki o nazwie „make”, która wypluwa informacje o tym, czy kompilacja się powiedzie i jak długo to trwało. Inne funkcje powłoki w środowisku kompilacji AOSP używają command makedo wywoływania faktycznego programu make. Niestety mam inne skrypty powłoki, które zepsuły się, gdy środowisko AOSP zaczęło dodawać gówno do makewyników programu i było to irytujące jak diabli dowiedzieć się, skąd to dodatkowe wyjście pochodziło w tajemniczy sposób.
Michael Burr
6

Ma dwa różne zastosowania:

Jednym z zastosowań jest zignorowanie aliasów i funkcji oraz uruchomienie pliku wykonywalnego znalezionego w PATH, nawet jeśli istnieje alias lub funkcja o tej samej nazwie.

Jako przykład lsużyję aliasu, który dodaje /nazwy katalogów do:

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

W interaktywnej powłoce wygodniejsze może być użycie odwrotnego ukośnika przed nazwą polecenia jako alternatywnej, krótszej składni:

$ \ls -d .
.

Innym zastosowaniem jest znalezienie polecenia, które zostanie uruchomione, gdy nazwa polecenia nie zostanie użyta przy użyciu opcji -v. Wydaje się być najbardziej przenośnym wariantem POSIX which.

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
Volker Siegel
źródło
4

commandjest przydatny, na przykład, jeśli chcesz sprawdzić, czy istnieje określone polecenie. whichuwzględnia w wyszukiwaniu aliasy, więc nie nadaje się do tego celu, ponieważ nie chcesz, aby losowy alias był uważany za dane polecenie.

Innymi słowy, możesz mieć małą funkcję w skrypcie powłoki, taką jak ta:

exists() {
  command -v "$1" >/dev/null 2>&1
}

A następnie przetestuj dostępne polecenie (tutaj, 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
Ville
źródło