Shell - Come trovare la directory di alcuni comandi?


127

So che quando sei sulla shell, gli unici comandi che possono essere usati sono quelli che puoi trovare su alcune directory impostate su PATH. Anche se non so come vedere quali dir sono sulla mia variabile PATH (e questa è un'altra buona domanda a cui si potrebbe rispondere), quello che mi piacerebbe sapere è:

Vengo a shell e scrivo:

$ lshw

Voglio sapere un comando sulla shell che può dirmi DOVE si trova questo comando. In altre parole, dove si trova questo "file eseguibile"?

Qualcosa di simile a:

$ location lshw
/usr/bin

Chiunque?

Risposte:


187

Se stai usando Bash o zsh, usa questo:

type -a lshw

Questo mostrerà se la destinazione è un builtin, una funzione, un alias o un eseguibile esterno. In quest'ultimo caso, mostrerà ogni luogo in cui appare nel tuo PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

In Bash, per le funzioni type -averrà visualizzata anche la definizione della funzione. Puoi usare declare -f functionnameper fare la stessa cosa (devi usarlo per zsh, poiché type -anon lo fa).


Ringrazia tutti quelli che hanno risposto, ma questa risposta è stata la più emozionante! Grazie! Pensavo di essere pazzo, perché ho definito (molto tempo fa) un modo per farlo: "update", e questo ha fatto "apt-get update; apt-get dist-upgrade 'per me. Ma per ora, stavo cercando di trovare qualche file update.sh da qualche parte, e non sono riuscito a trovarlo. Ecco perché ho iniziato questa domanda. Ma ora, usando 'type -a update' ho scoperto che questo era solo un alias definito sul mio .bashrc situato nella mia ~ casa. Grazie davvero.
Gabriel L. Oliveira,

1
@Gabriel: se non hai familiarità con locatequesto può aiutarti a trovare i file. Utilizza un database gestito dal updatedbquale viene eseguito da un processo cron. Dato che locatecerca un database piuttosto che l'intero filesystem è molto più veloce di find(che potrebbe essere usato come ultima risorsa).
In pausa fino a nuovo avviso.

Grazie. Studierò questo strumento e vedrò come è pianificato il funzionamento di updateb sul cronjob di Ubuntu.
Gabriel L. Oliveira,

A volte type -apuò essere fonte di confusione. ad esempio nel caso in nvmcui sia una funzione bash che dovevo fare: type -a nvm | head -n1scoprire che cosa è esattamente nvm.
Marinos Il

@MarinosAn: per le funzioni, type -agenera la definizione della funzione e il tipo di eseguibile. Il rischio con l'utilizzo headè che nel caso di nomi con più di un tipo, i tipi aggiuntivi non verrebbero prodotti. Potresti voler guardare type -t.
In pausa fino a nuovo avviso.

64

Come questo:

which lshw

Per vedere tutti i comandi corrispondenti al tuo percorso:

which -a lshw 

7
anche quale -a lshw per vedere tutti i comandi che corrispondono nel tuo percorso.
AlG,

Credo che questo funzioni solo con i comandi (eseguibili sul $ PATH), non con le funzioni.
Olivier Lacan,

whichè problematico perché ci sono molteplici implementazioni, molte delle quali fanno completamente la cosa sbagliata, e altre sembrano funzionare bene, ma hanno strane sorprese. Dovresti preferire typeinvece.
triplo

Non funziona con alias e funzioni bash. Almeno su Ubuntu. Uso miglioretype -a lshw
Marinos Il

17

PATH è una variabile d'ambiente e può essere visualizzata con il comando echo:

echo $PATH

È un elenco di percorsi separati dal carattere due punti ' :'

Il whichcomando indica quale file viene eseguito quando si esegue un comando:

which lshw

a volte quello che ottieni è un percorso verso un collegamento simbolico; se vuoi rintracciare quel link dove vive il vero eseguibile, puoi usare readlinke alimentare l'output di which:

readlink -f $(which lshw)

Il -fparametro indica readlinkdi continuare a seguire ricorsivamente il collegamento simbolico.

Ecco un esempio dalla mia macchina:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh

5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz

3

In TENEX C Shell, tcsh , è possibile elencare le posizioni di un comando, o se si tratta di un comando integrato, utilizzando il wherecomando ad es .:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd

0

La shell Korn ksh, offre il whencebuilt-in, che identifica altri built-in della shell, macro, ecc. Il whichcomando è comunque più portatile.


1
In ksh, whence -aè simile a quello di Bash type -a.
In pausa fino a nuovo avviso.

0

Un'alternativa type -aècommand -V

Dal momento che la maggior parte delle volte sono interessato solo al primo risultato, faccio pipa anche dalla testa. In questo modo lo schermo non si riempie di codice in caso di una funzione bash.

command -V lshw | head -n1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.