Was nützt der Befehl: `command`?

34

Kürzlich habe ich befehl gefunden: commandder keine manuelle eingabe hat aber die hilfe wie folgt anzeigt:

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

Ist das command -veine Alternative von which?

Welche Argumente werden von diesem Befehl akzeptiert und wie / wann command?

Pandya
quelle

Antworten:

44

commandist ein bash builtin wie wir sehen können:

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

Wir wissen commandalso, dass unsere Shell, bash , für uns sorgt. Wenn man bashwir uns vertiefen , können wir sehen, wozu es dient:

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

Im Wesentlichen würden Sie verwenden command, um "normale Funktionssuche" zu umgehen. Angenommen, Sie hatten eine Funktion in Ihrem .bashrc:

function say_hello() {
   echo 'Hello!'
}

Normalerweise, wenn Sie laufen say_hellowürde die Funktion mit dem Namen finden in Ihrem Terminal bash say_helloin Ihrem .bashrc bevor es gefunden, sagen wir, eine Anwendung mit dem Namen say_hello. Verwenden von:

command say_hello  

Lässt Bash seine normale Funktionssuche umgehen und geht direkt zu Builtins oder Your $PATH. Beachten Sie, dass diese Funktionssuche auch Aliase enthält. Mit commandwerden sowohl Funktionen als auch Aliase umgangen.

Wenn die -pOption verfügbar ist, umgeht bash Ihre benutzerdefinierten Einstellungen $PATHund verwendet die eigenen Standardeinstellungen.

Die -voder -VFlags-Bash gibt eine Beschreibung (kurz für -v, lang für -V) des Befehls aus.

Hinweis: Wie souravc in den Kommentaren ausgeführt hat, finden Sie hier eine einfachere Methode zum Auffinden von Informationen über Shell-Builtins: Wie kann man für Shell-Builtin-Befehle und -Schlüsselwörter arbeiten?

Seth
quelle
1
Schauen Sie sich auch Thsi
souravc
@souravc Das ist lustig, ich habe keine Manpage für commandauf meinem Computer.
Seth
2
versuchen Sie es sudo apt-get install manpages-posix. Es ist nicht standardmäßig installiert. schau mal hier
souravc
@souravc Sehr gut! Ich werde diesen Link in der Antwort bearbeiten.
Seth
1
@ Nori-chan Bash ist Ubuntus Standard- Shell . Es ist die Sache, die die von Ihnen eingegebenen Befehle interpretiert und entscheidet, was zu tun ist und wie dies mit den von Ihnen eingegebenen Informationen geschehen soll. Indem Sie die Un * x-Befehlszeile lernen, lernen Sie (in gewisser Weise) bash :)
Seth
14

Dies ist ein integrierter Befehl der Bash-Shell.

Der einzige Vorteil, den ich mit dieser integrierten Funktion sehe, ist im folgenden Satz des Hilfetexts zusammengefasst:

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

Wenn Sie also ein Programm ausführen möchten (eine Binärdatei, die auf einem Teil Ihrer Festplatte gespeichert ist) und eine interne Shell-Funktion mit demselben Namen vorhanden ist, können Sie Ihr Programm mit dieser integrierten Funktion aufrufen.

Und ja, command -vwird die gleiche Art von Ergebnis geben wie type.

Ich habe es auch unter der Dash-Shell gefunden.

Benoit
quelle
1
Was es wert ist, expliziter hinzugefügt zu werden, ist, dass command (name)Shell-Funktionen zwar ignoriert werden, dies command -v (name)jedoch nicht. command -v (name) >/dev/nullsoll die portable Möglichkeit sein, zu überprüfen, ob der Befehl mit diesem Namen existiert, unabhängig davon, ob es sich um eine eingebaute Shell, eine Funktion oder ein externes Dienstprogramm handelt.
HDV
1
befehl -v ist die posix-alternative, zu der stapelüberlauf.de
Javier López
Für ein reales Beispiel definiert die Android AOSP-Build-Umgebung (irgendwann nach v4.2.2) eine Shell-Funktion namens 'make', die Informationen darüber ausgibt, ob ein Build erfolgreich war oder nicht und wie lange es gedauert hat. Andere Shell-Funktionen in der AOSP-Build-Umgebung verwenden command make, um das tatsächliche Programm make aufzurufen. Leider habe ich andere Shell-Skripte, die kaputt gingen, als die AOSP-Umgebung anfing, die makeProgrammausgaben mit Scheiße zu versehen, und es war verdammt irritierend, herauszufinden, woher diese zusätzliche Ausgabe auf mysteriöse Weise stammte.
Michael Burr
6

Es hat zwei verschiedene Verwendungszwecke:

Eine Möglichkeit besteht darin, Aliase und Funktionen zu ignorieren und die in PATH gefundene ausführbare Datei auszuführen , auch wenn ein Alias ​​oder eine Funktion mit demselben Namen vorhanden ist.

Als Beispiel verwende ich einen Alias ​​für lsdas Anhängen eines /an Verzeichnisnamen:

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

In einer interaktiven Shell ist es möglicherweise praktischer, einen Backslash vor dem Befehlsnamen als alternative, kürzere Syntax zu verwenden:

$ \ls -d .
.

Die andere Verwendung besteht darin , den Befehl zu finden, der ausgeführt wird, wenn der Befehlsname nicht mithilfe der Option verwendet wird -v. Es scheint die portabelste / POSIX-Variante von zu sein which.

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
Volker Siegel
quelle
4

commandDies ist beispielsweise nützlich, wenn Sie überprüfen möchten, ob ein bestimmter Befehl vorhanden ist. whichBezieht Aliase in die Suche ein, sodass sie für diesen Zweck nicht geeignet sind, da Sie nicht möchten, dass ein zufälliger Alias ​​als der betreffende Befehl betrachtet wird.

Mit anderen Worten, Sie können eine kleine Funktion in einem Shell-Skript wie folgt haben:

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

Und dann teste auf einen verfügbaren Befehl (hier, dialog) wie folgt:

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
quelle