Qual è il comando unix per scoprire quale file eseguibile corrisponde a un determinato comando?


22

Ad esempio, se passato lscome input, dovrebbe dirmi che /bin/lsverrà eseguito se eseguito lssulla riga di comando.

Risposte:


25

Il comando da usare varia da shell a shell.

Solo un built-in della shell dirà correttamente cosa farà la shell per un determinato nome di comando, poiché solo i built-in possono conoscere appieno gli alias, le funzioni della shell, altri built-in e così via. Ricorda: non tutti i comandi corrispondono in primo luogo ai file eseguibili.

  • Per la Bourne Again shell, bash, incorporato è il typecomando:

    $ type '['
    [ is a shell builtin
    
  • Per la conchiglia di pescefish , The typebuiltin funziona in modo simile a bash. Per ottenere solo il percorso di un eseguibile, utilizzare command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Per la Korn Shell, ksh, il built-in è il whencecomando - con typecreato inizialmente come alias ordinario whence -ve il commandbuilt-in con l' -vopzione equivalente a whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Per la Z shell, zsh, il built-in è il whencecomando con il commandbuilt-in con l' -vopzione equivalente al whenceei built-in type, whiche wherepari a whencecon le opzioni -v, -ce -ca, rispettivamente.

    $ whence ls
    /bin/ls
    
  • Per il TC Shell, tcsh, il built-in è il whichcomando di - da non confondere con qualsiasi comando esterno con quel nome:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

Ulteriori letture


Nota che sotto ksh, "tipo" è un alias predefinito per "da cui -v", quindi può essere usato proprio come con la tradizionale shell bourne e bash.
jlliagre,

typeè anche incorporato in zsh?
Hongxu Chen,

RHEL6 in cui RPM (ad es. which-2.19-6.el6.x86_64) Inserisce un file di avvio /etc/profile.d/which2.sh. Questo viene letto da shell non csh, incluso zsh. Alias whicha se stesso. Quindi, in particolare per gli utenti zsh, sostituisce il comando incorporato which.
Dan Pritts,

14

Puoi usare whichper questo:

aix@aix:~$ which ls
/bin/ls

Funziona cercando i PATHfile eseguibili corrispondenti ai nomi degli argomenti. Si noti che non funziona con gli alias di shell:

aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin    dev   initrd.img      lib32   media  proc  selinux  tmp  vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$

type, tuttavia, funziona:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'

3
Fai attenzione: se ls è una funzione o è aliasato, vuoi "digitare ls" piuttosto che "quale ls"
William Pursell,

1
whichnon è necessariamente sufficiente da solo. Restituisce solo il primo nome trovato in $ PATH ... Quel nome può essere un collegamento simbolico e non l' eseguibile di fine catena .
Peter.O

8

whichnon non (necessariamente) restituire il file eseguibile. Restituisce il primo nome di file corrispondente che trova nel $ PATH (o più file simili come quando si utilizza which -a) ... L' eseguibile effettivo potrebbe essere più collegamenti di distanza.

  • which locate
    /usr/bin/locate
    `
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

Il comando che trova l' eseguibile effettivo è readlink -e,
(insieme a which)

  • readlink -e $(which locate)
    /usr/bin/mlocate

Per vedere tutti i collegamenti intermedi :

f="$(which locate)"             # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do  # follow links to executable
    printf "# %s\n" "$f"
done

# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate

4

Puoi provare:

whereis ls

Mi dà:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
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.