¿Para qué sirve el comando: `command`?

34

Recientemente encontré el comando: commandque no tiene entrada manual, pero la ayuda se muestra de la siguiente manera:

$ 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 -vEs alternativa de which?

¿Qué argumentos son aceptados por este comando y cómo / cuándo usar command?

Pandya
fuente

Respuestas:

44

commandes un bash incorporado como podemos ver:

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

Entonces sabemos que commandes proporcionado por nuestro shell, bash. Profundizando man bashpodemos ver cuál es su uso:

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

Esencialmente, usaría commandpara omitir la "búsqueda de función normal". Por ejemplo, supongamos que tenía una función en su .bashrc:

function say_hello() {
   echo 'Hello!'
}

Normalmente, cuando ejecuta say_helloen su terminal bash encontraría la función nombrada say_helloen su .bashrc antes de encontrar, por ejemplo, una aplicación llamada say_hello. Utilizando:

command say_hello  

hace que bash omita la búsqueda de su función normal y vaya directamente a los builtins o al suyo $PATH. Tenga en cuenta que esta función de búsqueda también incluye alias. El uso commandomitirá ambas funciones y alias.

Si -pse proporciona la opción, bash omite su personalizado $PATHy usa su propio valor predeterminado.

El -vo -Vflags bash imprime una descripción (breve -v, larga -V) del comando.

Nota: Como souravc señaló en los comentarios, puede encontrar aquí un método más fácil para encontrar información sobre los componentes integrados de shell: ¿Cómo hacer que `man` funcione para los comandos y palabras clave de shell incorporado?

Seth
fuente
1
También mirar thsi
souravc
@souravc Eso es gracioso, no tengo una página de manual para commandmi máquina.
Seth
2
tratar sudo apt-get install manpages-posix. No está instalado por defecto. mira aquí
souravc
@souravc ¡Muy bien! Editaré ese enlace en la respuesta.
Seth
1
@ Nori-chan Bash es el shell predeterminado de Ubuntu . Es lo que interpreta los comandos que ingresa y decide qué hacer y cómo hacerlo con la información que ingresa. Al aprender la línea de comandos Un * x, estás (en cierto modo) aprendiendo bash :)
Seth
14

Este es el comando incorporado del shell Bash.

La única ventaja que veo con este incorporado se resume en la siguiente oración del texto de ayuda:

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

Entonces, si desea ejecutar un programa (un archivo binario guardado de parte de su disco), y existe una función interna del mismo nombre, puede invocar su programa utilizando este incorporado.

Y sí, command -vdará el mismo tipo de resultado que type.

Lo encontré también debajo del shell Dash.

Benoit
fuente
1
Lo que vale la pena agregar más explícitamente es que aunque command (name)ignora las funciones de shell, command -v (name)no lo hace. command -v (name) >/dev/nullse supone que es la forma portátil de verificar si existe el comando con ese nombre, independientemente de si se trata de un shell incorporado, una función o una utilidad externa.
hvd
1
command -v es la alternativa posix a la cual, tipo, etc., stackoverflow.com/questions/762631/…
Javier López
Para un ejemplo del mundo real, el entorno de compilación de Android AOSP (en algún momento después de v4.2.2) define una función de shell llamada 'make' que escupirá información sobre si una compilación tiene éxito o no y cuánto tiempo tardó. Otras funciones de shell en el entorno de compilación AOSP se utilizan command makepara invocar el programa make real-factual. Desafortunadamente, tengo otros scripts de shell que se rompieron cuando el entorno AOSP comenzó a agregar mierda a lo que elmake programa genera y fue irritante como descubrir de dónde provenía misteriosamente ese resultado adicional.
Michael Burr
6

Tiene dos usos diferentes:

Un uso es ignorar los alias y las funciones , y ejecutar el archivo ejecutable que se encuentra en PATH, incluso cuando existe un alias o una función con el mismo nombre.

Como ejemplo, usaré un alias para lsque anexe /a los nombres de directorio:

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

En un shell interactivo, puede ser más conveniente usar una barra diagonal inversa antes del nombre del comando como sintaxis alternativa más corta:

$ \ls -d .
.

El otro uso es encontrar el comando que se ejecutará cuando el nombre de los comandos no se use mediante la opción -v. Parece ser la variante más portátil / POSIX de which.

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

command es útil, por ejemplo, si desea verificar la existencia de un comando en particular. whichincluye alias en la búsqueda, por lo que no es adecuado para este propósito porque no desea que se considere un alias aleatorio como el comando en cuestión.

En otras palabras, puede tener una pequeña función en un script de shell como este:

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

Y luego pruebe un comando disponible (aquí, dialog), así:

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
fuente