Belirli bir komuta hangi yürütülebilir dosyanın karşılık geldiğini bulmak için unix komutu nedir?


22

Örneğin, lsgirdi olarak iletilirse , komut satırında /bin/lsçalıştırılırsa çalışacağını söylemelidir ls.

Yanıtlar:


25

Kullanılacak komut kabuktan kabuğa değişir.

Yalnızca yerleşik bir kabuk, belirli bir komut adı için kabuğun ne yapacağını doğru bir şekilde söyleyecektir, çünkü yalnızca yerleşik adlar diğer adlar, kabuk işlevleri, diğer yerleşik öğeler vb. Hakkında tam olarak bilgi sahibi olabilir. Unutmayın: İlk olarak tüm komutlar yürütülebilir dosyalara karşılık gelmez.

  • Bourne Yine kabuk için bash, yerleşik olan typekomut:

    $ type '['
    [ is a shell builtin
    
  • Balık kabuğu içinfish , typeyerleşik bash benzer şekilde çalışır. Yalnızca yürütülebilir dosyanın yolunu bulmak için şunu kullanın command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Korn Shell için ksh, yerleşik olan whencekomut - ile typebaşlangıçta için sıradan bir takma ad olarak ayarlamaya whence -vve commanddahili ile -vseçeneği eşdeğeri whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Z Shell için zsh, yerleşik olduğu whenceile, komut commandile dahili -vseçeneği eşdeğer whenceve yerleşik ins type, whichve whereeşdeğer whenceseçenekleri ile -v, -cve -casırasıyla.

    $ whence ls
    /bin/ls
    
  • TC Shell için tcsh, yerleşik olan whichkomut - bu isimde herhangi bir dış komut ile karıştırılmamalıdır:

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

daha fazla okuma


Ksh altında, "type" ın "whence -v" için varsayılan bir takma ad olduğunu ve bu nedenle geleneksel bourne kabuğu ve bash gibi kullanılabileceğini unutmayın.
jlliagre

typeayrıca zsh için yerleşiktir?
Hongxu Chen

Hangi RPM'nin (örn. which-2.19-6.el6.x86_64) Bir başlangıç ​​dosyası koyduğu RHEL6's /etc/profile.d/which2.sh. Bu, zsh dahil olmak üzere csh dışı kabuklar tarafından okunur. Kendisi için takma ad whicholuşturuyor. Bu nedenle, özellikle zsh kullanıcıları için yerleşik olanları kırıyor which.
Dan Pritts

14

Bunun için kullanabilirsiniz which:

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

PATHBağımsız değişkenlerin adlarıyla eşleşen yürütülebilir dosyaları arayarak çalışır . Bunun kabuk takma adları ile çalışmadığını unutmayın:

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

typeancak, şu şekilde çalışır:

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

3
Dikkatli olun: ls bir işlevse veya diğer ad ise, 'hang ls' yerine 'type ls' istiyorsunuz
William Pursell

1
whichtek başına yeterli değildir. Sadece döner ilk FOUND adını Yani ... $ PATH içinde adı sembolik bağlantı ve olabilir değil gerçek -sonu zinciri çalıştırılabilir.
Peter.O

8

whichetmez değildir (zorunlu olarak) yürütülebilir dosya döndürür. $ PATH içinde bulduğu ilk eşleşen dosya adını (veya kullanırken adlandırılmış birden çok dosya gibi which -a) döndürür ... Gerçek yürütülebilir dosya birden çok bağlantı uzakta olabilir.

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

Gerçek yürütülebilir dosyayı bulan komut readlink -e,
(ile bağlantılı olarak which)

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

Tüm ara bağlantıları görmek için :

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

Deneyebilirsin:

whereis ls

Bana verir:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.