Czym jest polecenie unix, aby dowiedzieć się, jaki plik wykonywalny odpowiada danemu poleceniu?

22

Na przykład, jeśli zostanie przekazany lsjako dane wejściowe, powinien mi powiedzieć, że /bin/lsbędzie działać, jeśli zostanie uruchomiony lsw wierszu polecenia.

hugomg
źródło

Odpowiedzi:

25

Polecenie do użycia różni się w zależności od powłoki.

Tylko wbudowana powłoka powie jednemu poprawnie, co zrobi powłoka dla danej nazwy polecenia, ponieważ tylko wbudowane mogą w pełni wiedzieć o aliasach, funkcjach powłoki, innych wbudowanych itd. Pamiętaj: przede wszystkim nie wszystkie polecenia odpowiadają plikom wykonywalnym.

  • Dla Bourne Again Shell, bash, wbudowany jest typepolecenie:

    $ type '['
    [ is a shell builtin
    
  • Dla ryb skorupach,fish The typewbudowane działa podobnie do bash. Aby uzyskać tylko ścieżkę do pliku wykonywalnego, użyj command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Dla powłoki Korn ksh, wbudowany jest whencekomenda - z typewstępnie skonfigurować jako zwykły alias whence -va commandwbudowany z -vekwiwalentu opcja whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Dla Z Shell zsh, wbudowany jest whencekomenda, z commandwbudowaną z -vekwiwalentu opcja whencea wbudowany ins type, whichi whererównoważna whencez opcjami -v, -ci -caodpowiednio.

    $ whence ls
    /bin/ls
    
  • Dla TC Shell tcsh, wbudowany jest whichpolecenie - nie mylić z dowolnego zewnętrznego polecenia o tej samej nazwie:

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

Dalsza lektura

JdeBP
źródło
Zauważ, że pod ksh „typ” jest domyślnym aliasem dla „wherece -v”, więc można go używać tak samo, jak w tradycyjnej powłoce Bourne'a i bash.
jlliagre
typejest również wbudowany w Zsh?
Hongxu Chen
RHEL6, w których RPM (np. which-2.19-6.el6.x86_64) Umieszcza plik startowy /etc/profile.d/which2.sh. Jest to odczytywane przez powłoki inne niż csh, w tym zsh. Alias whichdo siebie. W szczególności dla użytkowników zsh zastępuje on wbudowane funkcje which.
Dan Pritts,
14

Możesz użyć whichdo tego:

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

Działa poprzez wyszukiwanie PATHplików wykonywalnych pasujących do nazw argumentów. Zauważ, że nie działa z aliasami powłoki:

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:~$

typedziała jednak:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
źródło
3
Zachowaj ostrożność: jeśli ls jest funkcją lub jest alias, to chcesz „wpisać ls”, a nie „który ls”
William Pursell
1
whichsamo w sobie niekoniecznie wystarcza. Zwraca tylko pierwszą znalezioną nazwę w $ PATH ... Ta nazwa może być dowiązaniem symbolicznym, a nie rzeczywistym plikiem wykonywalnym końca łańcucha .
Peter.O,
8

whichczy nie (koniecznie) zwracają plik wykonywalny. Zwraca pierwszą pasującą nazwę pliku, którą znajdzie w zmiennej $ PATH (lub wiele podobnych nazwanych plików podczas używania which -a) ... Rzeczywisty plik wykonywalny może być oddalony o wiele linków.

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

Polecenie, które znajduje się rzeczywistą wykonywalnego readlink -e,
(w połączeniu z which)

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

Aby zobaczyć wszystkie linki pośrednie :

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
Peter.O
źródło
4

Możesz spróbować:

whereis ls

To daje mi:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Ivan Morgillo
źródło