Quelle est l'utilisation de la commande: `commande`?

34

Récemment, j'ai trouvé la commande: commandqui n'a pas d'entrée manuelle mais l'aide s'affiche comme suit:

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

Est l' command -valternative de which?

Quels arguments sont acceptés par cette commande et comment / quand utiliser command?

Pandya
la source

Réponses:

44

commandest une fête builtin comme on peut le voir:

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

Donc, nous savons commandest fourni par notre shell, Bash. En creusant, man bashnous pouvons voir à quoi sert son utilisation:

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

Essentiellement, vous utiliseriez commandpour contourner la "recherche de fonction normale". Par exemple, supposons que vous ayez une fonction dans votre .bashrc:

function say_hello() {
   echo 'Hello!'
}

Normalement, lorsque vous exécutez say_hellovotre terminal, bash trouve la fonction nommée say_hellodans votre .bashrc avant de trouver, par exemple, une application nommée say_hello. En utilisant:

command say_hello  

fait de bash sa recherche de by - pass fonction normale et aller directement soit à builtins ou votre $PATH. Notez que cette recherche de fonction inclut également des alias. L'utilisation commandcontournera les deux fonctions et les alias.

Si l' -poption est fournie, bash contourne votre personnalisation $PATHet utilise ses propres valeurs par défaut.

Le -vou -Vdrapeaux bash affiche une description (abréviation de -vlong pour -V) de la commande.

Remarque: Comme Souravc a souligné dans les commentaires, une méthode plus simple pour trouver des informations sur les commandes intégrées au shell peut être trouvée ici: Comment utiliser `man` pour les commandes et les mots-clés intégrés au shell?

Seth
la source
1
Regardez aussi thsi
souravc
@souravc C'est drôle, je n'ai pas de page de manuel commandsur ma machine.
Seth
2
essayez sudo apt-get install manpages-posix. Il n'est pas installé par défaut. Regardez ici
Souravc
@souravc Très bien! Je vais éditer ce lien dans la réponse.
Seth
1
@ Nori-chan Bash est le shell par défaut d'Ubuntu . C'est la chose qui interprète les commandes que vous entrez et décide quoi faire et comment le faire avec les informations que vous entrez. En apprenant la ligne de commande Un * x, vous apprenez (en quelque sorte) bash :)
Seth
14

C'est la commande intégrée du shell Bash.

Le seul avantage que je vois avec cette fonction intégrée est résumé dans la phrase suivante du texte d'aide:

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

Donc, si vous voulez exécuter un programme (un fichier binaire sauvegardé sur une partie de votre disque) et une fonction shell interne du même nom existent, vous pouvez appeler votre programme en utilisant cette fonction intégrée.

Et oui, command -vdonnera le même genre de résultat que type.

Je l'ai trouvé aussi sous le shell Dash.

Benoit
la source
1
Ce qui mérite d’être ajouté de manière plus explicite, c’est que bien qu’il command (name)ignore les fonctions du shell, command -v (name)il ne le fait pas. command -v (name) >/dev/nullest supposé être le moyen portable de vérifier si la commande portant ce nom existe, qu’il s’agisse d’un shell intégré, d’une fonction ou d’un utilitaire externe.
hvd
1
commande -v est l'alternative posix à laquelle, tapez, etc., stackoverflow.com/questions/762631/…
Javier López
Dans un exemple concret, l'environnement de génération Android AOSP (à un moment donné après la v4.2.2) définit une fonction shell nommée 'make' qui va cracher des informations sur le succès ou non de la construction et sur sa durée. D'autres fonctions de shell de l'environnement de génération AOSP utilisent command makepour appeler le programme make factuel. Malheureusement, d'autres scripts shell ont éclaté lorsque l'environnement AOSP a commencé à ajouter de la merde aux résultats du makeprogramme et il était énervant de découvrir d'où venait mystérieusement cette sortie supplémentaire.
Michael Burr
6

Il a deux utilisations différentes:

Une utilisation possible consiste à ignorer les alias et les fonctions et à exécuter le fichier exécutable se trouvant dans PATH, même lorsqu'un alias ou une fonction portant le même nom existe déjà.

Par exemple, je vais utiliser un alias pour lsajouter un nom /de répertoire à:

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

Dans un shell interactif, il peut être plus pratique d’utiliser une barre oblique inverse avant le nom de la commande comme autre syntaxe plus courte:

$ \ls -d .
.

L'autre utilisation consiste à rechercher la commande à exécuter lorsque le nom de la commande n'est pas utilisé à l'aide de l'option -v. Il semble être la variante la plus portable / POSIX de which.

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

commandest utile, par exemple, si vous voulez vérifier l'existence d'une commande particulière. whichinclut des alias dans la recherche, ce qui ne convient pas à cette fin, car vous ne voulez pas qu'un alias aléatoire soit considéré comme la commande en question.

En d'autres termes, vous pouvez avoir une petite fonction dans un script shell comme ceci:

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

Et puis testez une commande disponible (ici, dialog), comme ceci:

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
la source