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.