A cosa serve il comando: 'comando'?

19

Recentemente ho trovato il comando: command che non ha una voce manuale ma help visualizza nel modo seguente:

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

Is command -v è un'alternativa di which ?

Quali argomenti sono accettati da questo comando e come / quando usare command ?

    
posta Pandya 18.08.2014 - 08:02

5 risposte

32

command è un bash builtin come possiamo vedere:

[email protected]:~$ type command
command is a shell builtin

Quindi sappiamo che command è fornito dalla nostra shell, bash. Scavando in man bash possiamo vedere qual è il suo utilizzo:

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

Essenzialmente useresti command per aggirare la "normale ricerca di funzioni". Ad esempio, supponi di avere una funzione in .bashrc :

function say_hello() {
   echo 'Hello!'
}

Normalmente, quando si esegue say_hello nella bash del terminale si trova la funzione denominata say_hello nella tua .bashrc prima ha trovato, ad esempio, un'applicazione denominata say_hello . Utilizzo:

command say_hello  

fa bash bypassare la sua normale funzione di ricerca e passare direttamente a entrambi i builtin o al tuo $PATH . Si noti che questa funzione cerca anche include alias. L'utilizzo di command esclude entrambe le funzioni e gli alias.

Se viene fornita l'opzione -p bash ignora il $PATH personalizzato e utilizza il proprio valore predefinito.

Il -v o -V flags bash stampa una descrizione (abbreviazione di -v , long per -V ) del comando.

Nota: come segnalato da souravc nei commenti, è possibile trovare un metodo più semplice per trovare informazioni sui builtin della shell: Come far funzionare 'man' per i comandi e le parole chiave incorporati nella shell?

    
risposta data Seth 19.10.2014 - 05:43
13

Questo è il comando integrato della shell Bash.

L'unico vantaggio che vedo con questo built-in è riepilogato nella seguente frase del testo di aiuto:

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

Quindi se vuoi eseguire un programma (un file binario salvato da alcuni dei tuoi dischi) e esiste una funzione shell interna con lo stesso nome, puoi invocare il tuo programma usando questo built-in.

E sì, command -v darà lo stesso tipo di risultato di type .

L'ho trovato anche sotto la shell di Dash.

    
risposta data Benoit 18.08.2014 - 09:11
6

Ha due diversi usi:

Un uso è ignorare alias e funzioni ed eseguire il file eseguibile trovato in PATH, anche quando un alias o una funzione con esiste lo stesso nome.

Ad esempio, utilizzerò un alias per ls che aggiunge un / ai nomi delle directory:

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

In una shell interattiva, potrebbe essere più comodo utilizzare una barra rovesciata prima del nome del comando come sintassi alternativa, più breve:

$ \ls -d .
.

L'altro uso è trovare il comando che verrà eseguito quando il nome dei comandi non viene utilizzato utilizzando l'opzione -v . Sembra essere la variante POSIX più portabile di which .

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
    
risposta data Volker Siegel 19.10.2014 - 13:23
2

Ti permette di eseguire un comando di shell ignorando qualsiasi funzione di shell.

link

    
risposta data Paul Tanzini 19.10.2014 - 05:42
1

command è utile, ad esempio, se si desidera verificare l'esistenza di un particolare comando. which include alias nella ricerca quindi non è adatto a questo scopo perché non vuoi che un alias casuale sia considerato come il comando in questione.

In altre parole, puoi avere una piccola funzione in uno script di shell come questo:

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

E poi prova per un comando disponibile (qui, dialog ), in questo modo:

if ! exists dialog ; then
   echo "This script requires 'dialog'."
   echo "Install it with 'sudo apt-get install dialog', then try again!"
   exit 1
fi
    
risposta data Ville 12.02.2018 - 00:38

Leggi altre domande sui tag