62 votes

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

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

$ aide commande
commande : commande [-pVv] commande [arg ...]
    Exécute une commande simple ou affiche des informations sur les commandes.

    Exécute COMMAND avec ARGS en supprimant la recherche de fonctions de shell, ou affiche
    des informations sur les COMMANDs spécifiées. Peut être utilisé pour invoquer des commandes
    sur disque lorsqu'une fonction du même nom existe.

    Options :
      -p    utilise une valeur par défaut pour PATH qui garantit de trouver toutes les
        utilitaires standards
      -v    affiche une description de la COMMANDE similaire à la fonction `type'
      -V    affiche une description plus détaillée de chaque COMMANDE

    Statut de sortie :
    Renvoie le statut de sortie de la COMMANDE, ou un échec si la COMMANDE n'est pas trouvée.

Est-ce que command -v est une alternative de which?

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

73voto

Seth Points 53255

command est un bash builtin comme nous pouvons le voir :

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

Nous savons donc que command est fourni par notre shell, bash. En fouillant dans man bash, nous pouvons voir à quoi il sert :

(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 command pour contourner la "recherche de fonction normale". Par exemple, si vous aviez une fonction dans votre .bashrc :

function say_hello() {
   echo 'Hello!'
}

Normalement, lorsque vous exécutez say_hello dans votre terminal, bash trouverait la fonction nommée say_hello dans votre .bashrc avant de trouver, disons, une application nommée say_hello. En utilisant :

command say_hello  

bash contourne sa recherche de fonction normale et va directement aux commandes intégrées ou à votre $PATH. Notez que cette recherche de fonction inclut également les alias. En utilisant command, vous contournez à la fois les fonctions et les alias.

Si l'option -p est fournie, bash contourne votre $PATH personnalisé et utilise son propre chemin par défaut.

Les drapeaux -v ou -V font afficher une description (court pour -v, long pour -V) de la commande.

Remarque : Comme l'a souligné souravc 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 : How to make `man` work for shell builtin commands and keywords?

15voto

Benoit Points 7337

Ceci est une commande intégrée de l'interpréteur de commandes Bash.

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

Peut être utilisé pour appeler des commandes sur le disque lorsqu'une fonction du même nom existe.

Donc, si vous voulez exécuter un programme (un fichier binaire enregistré quelque part sur votre disque) et qu'une fonction interne de l'interpréteur de commandes porte le même nom, vous pouvez appeler votre programme en utilisant cette commande intégrée.

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

Je l'ai également trouvé dans l'interpréteur de commandes Dash.

12voto

Volker Siegel Points 12033

Il a deux utilisations différentes:

Une utilisation est d'ignorer les alias et les fonctions, et d'exécuter le fichier exécutable trouvé dans le CHEMIN, même lorsqu'un alias ou une fonction du même nom existe.

Par exemple, j'utiliserai un alias pour ls qui ajoute un / aux noms de répertoire:

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

Dans un shell interactif, il peut être plus pratique d'utiliser un backslash avant le nom de la commande comme syntaxe alternative et abrégée:

$ \ls -d .
.

L'autre utilisation est de trouver la commande qui sera exécutée lorsque le nom des commandes n'est pas utilisé en utilisant 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

4voto

Ville Points 141

command est utile, par exemple, si vous voulez vérifier l'existence d'une commande particulière. which inclut les alias dans la recherche, il n'est donc pas adapté à cet usage 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 ensuite tester la disponibilité d'une commande (ici, dialog), comme ceci:

if ! exists dialog ; then
   echo "Ce script nécessite 'dialog'."
   echo "Installez-le avec 'sudo apt-get install dialog', puis réessayez!"
   exit 1
fi

3voto

Paul Tanzini Points 3587

Il vous permet d'exécuter une commande shell en ignorant toutes les fonctions shell.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X