Kabuk - Bir komutun dizini nasıl bulunur?


128

Kabuk üzerindeyken, kullanılabilecek komutların yalnızca PATH üzerindeki bazı dizinde bulunanlar olduğunu biliyorum. PATH değişkenimde hangi dizinlerin olduğunu nasıl göreceğimi bilmesem bile (ve bu yanıtlanabilecek başka bir iyi soru), bilmek istediğim şey:

Kabuğa gelip yazıyorum:

$ lshw

Kabukta bu komutun nerede olduğunu söyleyebilecek bir komut bilmek istiyorum. Başka bir deyişle, bu "çalıştırılabilir dosya" nerede bulunur?

Gibi bir şey:

$ location lshw
/usr/bin

Kimse?

Yanıtlar:


188

Bash veya zsh kullanıyorsanız, şunu kullanın:

type -a lshw

Bu, hedefin bir yerleşik, bir işlev, bir takma ad veya bir harici yürütülebilir dosya olup olmadığını gösterecektir. İkincisi, sizin göründüğü her yeri gösterecektir 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

Bash'de, işlevler type -aayrıca işlev tanımını da görüntüler. declare -f functionnameAynı şeyi yapmak için de kullanabilirsiniz (zsh için kullanmalısınız, çünkü type -ayapmaz).


Cevaplayan herkese teşekkürler, ama bu cevap en heyecan vericiydi! Teşekkür ederim! Deli olduğumu düşünüyordum, çünkü (uzun zaman önce) bunu yapmanın bir yolunu tanımladım: 'güncelleme' ve bu 'apt-get update; apt-get dist-upgrade 'benim için. Ama şimdilik bir yerde update.sh dosyası bulmaya çalışıyordum ve bulamadım. Bu yüzden bu soruyu başlattım. Ama şimdi, 'type -a update' kullanarak bunun sadece ~ home'umda bulunan .bashrc dosyamda tanımlanan bir takma ad olduğunu buldum. Gerçekten teşekkür ederim.
Gabriel L. Oliveira

1
@Gabriel: Aşina değilseniz, locatedosyaları bulmanıza yardımcı olabilir. updatedbBir cron işinden çalıştırılan bir veritabanı kullanır . Yana locatearamalar Bir veritabanı yerine çok daha hızlı daha var bütün dosya sistemi find(ki son çare olarak kullanılabilir).
sonraki duyuruya kadar duraklatıldı.

Teşekkür ederim. Bu aracı inceleyeceğim ve updatedb'nin Ubuntu'nun cronjob'unda nasıl çalışacağını göreceğim.
Gabriel L. Oliveira

Bazen type -akafa karıştırıcı olabilir. örneğin nvmhangisinin bir bash işlevi olması durumunda yapmam gerekiyor: type -a nvm | head -n1tam olarak ne olduğunu bulmak için nvm.
Marinos An

@MarinosAn: İşlevler için, type -aişlev tanımının yanı sıra yürütülebilir dosyanın türünü de çıkarır . Kullanmanın riski, headbirden fazla türe sahip adlar olması durumunda, ek türlerin çıktısının olmamasıdır. Bakmak isteyebilirsin type -t.
sonraki duyuruya kadar duraklatıldı.

65

Bunun gibi:

which lshw

Yolunuza uyan tüm komutları görmek için:

which -a lshw 

7
Ayrıca yolunuzla eşleşen tüm komutları görmek için -a lshw.
AlG

Bunun işlevlerle değil, yalnızca komutlarla ($ PATH üzerindeki çalıştırılabilir dosyalar) çalıştığına inanıyorum.
Olivier Lacan

whichsorunludur çünkü birçoğu tamamen yanlış olan ve diğerleri iyi çalışıyor gibi görünen ancak garip sürprizler içeren birden fazla uygulama vardır. Bunun typeyerine tercih etmelisiniz .
üçlü

Takma adlar ve bash işlevleri için çalışmaz. En azından ubuntu'da. Daha iyi kullanımtype -a lshw
Marinos An

17

PATH bir ortam değişkenidir ve echo komutuyla görüntülenebilir:

echo $PATH

İki nokta üst üste karakteriyle ayrılmış yolların bir listesi ' :'

whichKomutu bir komut çalıştırdığınızda işletilirse hangi dosya anlatır:

which lshw

bazen bir sembolik bağa giden yoldur; Bu bağlantıyı gerçek yürütülebilir dosyanın nerede yaşadığını izlemek istiyorsanız, readlinkşu çıktıyı kullanabilir ve besleyebilirsiniz which:

readlink -f $(which lshw)

-fParametre talimatını readlinkyinelemeli sembolik aşağıdaki tutmak.

İşte makinemden bir örnek:

$ 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

TENEX C Kabuğu'nda, tcsh , bir komutun konumunu / konumlarını veya yerleşik bir komutsa , aşağıdaki komutu kullanarak listeleyebilir where:

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

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

1

Bir alternatif type -aDİRcommand -V

Çoğu zaman sadece ilk sonuçla ilgilendiğim için, aynı zamanda kafadan da pipo alıyorum. Bu şekilde, bir bash işlevi durumunda ekran kodla dolmayacaktır.

command -V lshw | head -n1

0

Korn kabuğu, diğer kabuk yerleşiklerini, makroları vb. Tanımlayan yerleşik özelliği kshsunar . Bununla birlikte, komut daha taşınabilirdir.whencewhich


1
Ksh'de Bash'inkine whence -abenzer type -a.
sonraki duyuruya kadar duraklatıldı.
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.