Unix yürütülebilir dosyaları nasıl arar?


46

Bir dosya yürütüldüğünde, Unix nasıl arar? PATH'de aynı ada sahip birden fazla çalıştırılabilir dosya varsa, hangisi tercih edilir? Bir dosya yürütülürken mevcut dizin aramaya dahil edildi mi?

executable.shGeçerli dizinde adı olan bir dosya olduğunu varsayalım . Bu idam edilirse $ executedve .bunun bir parçası değilse işe yarar PATHmı?


bahsetme which <executable>komutu bu başlıkta faydalı olacaktır.
Muhasebeci,

Yanıtlar:


44

$ PATH baştan sona aranır, eşleşen ilk çalıştırılabilir dosya çalıştırılır. Bu yüzden $ PATH'ın başındaki dizinler daha sonra gelecek olanlara göre önceliklidir. Geçerli dizindeki (.) Yürütülebilir dosyalar yalnızca varsa çalıştırılır. $ PATH ( genellikle değil ) cinsindendir . Geçerli dizinin arama yolunda örtülü bir etkisi yoktur.


$ PATH'imin içermemesi çok garip ., ancak $ PATH'da tanımlanan dizinleri kontrol etmeden önce ilk önce geçerli dizinden arama yapacak gibi görünüyor.
Eric Wang,

19

Geçerli dizindeki dosyalar için, onlardan önce geçmek istersiniz ./, böylece komut olur ./executable.sh. .Diğer problemlerin yanı sıra hiçbir zaman bir güvenlik riski oluşturduğu için PATH'nizde bulunmamalısınız .

PATH'te ilk gelen ve ilk aranan dizinler.

Genel düzen yanlış hatırlamıyorsam arama için şu şekildedir:

  • takma adları

  • dışa aktarılan işlevler

  • yerleşik kabuk komutları

  • PATH'nizdeki komut dosyaları ve ikili dosyalar


7
Hash'i eklerdim - bash'ı hatırlayın (ve belki diğer kabukları), onları daha kolay bulmak için en son kullanılan komutlardan oluşan bir karma tutar. Bazen hash -rPATH'nizi veya program konumlarınızı değiştirirseniz önbelleği temizlemeniz gerekir .
Rich Homolka

3
Arama sırası için +1. Eğer bilgi kaynağını hatırlarsan iyi olur :)
twan163

8

Buna bazılarının iyi cevap vermesine rağmen, bazı düşünceler eklemek isterim:

1) PATH'a yalnızca çalıştırılan çalıştırılabilir dosyada yol elementi yoksa danışılır. bazı komutlar PATH yerine $ PATH olarak aranır ./somecommandya /usr/bin/somecommandda ../../bin/somecommandsadece dizin kurallarını kullanır.

PATH'de aynı ada sahip birden fazla çalıştırılabilir dosya varsa, hangisi tercih edilir?

Bulduğu ilk durakta durur, $ PATH sola sağa okur.

Dosya çalıştırıldığında geçerli dizin aramaya dahil edildi mi?

Geçerli dizin PATH ise, aranır. PATH içindeki boş bir dizinin geçerli dizini içerdiğini unutmayın. örn. PATH =: / usr / bin (boş öncü) PATH = / usr / bin: (boş boş) ve PATH = / usr / bin :: / bin (orta boş) hepsi geçerli çalışma dizinini içerecektir.

Geçerli bir dizinde yürütülebilir.sh adında bir dosya olduğunu varsayalım. Bu işe yarar mı eğer $ yürütülürse ve. PATH'in bir parçası değil mi?

PATH'i arayarak asla bulamazdı. Geçerli dizin PATH'de değilse, PATH araması tarafından bulamaz.

Bu komutu (ve karışıklık eklediğim için üzgünüm) komutu çalıştıran bir diğer ad veya işlev olsaydı, çalıştırılırdı. Veya kabuğunuzun bir konum önbelleği varsa ve çalıştırılabilir dosya önbelldeyse, onu bulabilir. Böylece onu PATH'de asla bulamaz, ancak başka yollarla da çalıştırılabilir.


cacheNot için teşekkürler , eski çalıştırılabilir içeriğin /usr/bin/hala yenisinin kullanılmaya başlaması beni çıldırtıyor /usr/local/bin, ancak $PATHben çıkıncaya kadar sol tarafta ve tekrar giriş yaptım.
Muhasebeci,

1
bash @theaccotanttant kabuk hasarı temizlemek için 'hash -r' yapabilirsiniz
Rich Homolka

4

Şu anda yolunuzun ne olduğunu görmek için echo $PATH, veya yazın printenv PATH.

Sonra arama sırasını bilirsiniz. Aynı ada sahip birden fazla dosyanız varsa, hangi ______________ görmeniz yeterlidir.

Ör.

sistem #> hangi grep

/ Usr / bin / grep

Hedefiniz gibi çalışan dosyaları bulmak için harika bir yol apropos kullanmaktır:

Apropos Grep

bzgrep (1) - düzenli ifade için muhtemelen bzip2 sıkıştırılmış dosyaları ara

egrep (1) - bir kalıpla eşleşen satırları yazdır

fgrep (1) - desenle eşleşen satırları yazdır

grep (1) - desenle eşleşen satırları yazdır

ve bunun gibi...


2
Oh evet - Bir dosyanın TÜM örneklerini bulmak için whereis işlevini unuttum :> whereis grep
mbb

grep: / bin / grep / usr / bin / grep / usr/share/man/man1/grep.1.gz
mbb

whereisdeğil, kodlanmış bir konum listesi kullanır $PATH.
Gravity

@grawity Bu konuda genişleyebilir misiniz?
WinEunuuchs2Unix

-2

@ coneslayer- Çalıştırılabilir bulmanın varsayılan sırası, komutlar içinde yerleşik olan mevcut yoldur ve ardından $ PATH. Eğer çalıştırılabilir isminde bir işlev pwd'de zaten mevcutsa, o zaman bu exec.if çalıştırılmaz, o zaman öncelik kabuğun yerleşik komutlarını ve sonra $ PATH komutlarını arar.


40 yıl önceki Thompson kabuğu, Mashey kabuğu ya da diğer bazı fosilleşmiş tutucular hakkında konuşuyorsan, haklı olabilirsin. Ancak mevcut, ana akım Unix kabuğu geçerli dizini otomatik olarak arar.
Scott,

@Scott Yani bir komut için varsayılan arama yolu önce yerleşiktir, sonra $ PATH ve sadece eğer verirsem CWD'yi arar. Haklı mıyım?
proc

Peki, takma adlar, fonksiyonlar ve yerleşikler. Ardından, komutla bir yol belirtirseniz (dahil ./), yalnızca o dizinde arama yapar; Aksi takdirde arar $PATH.
Scott,
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.