./ vs . terminal altındaki programları çalıştırmak için


13

Terminal altında yürütülebilir dosyaları çalıştırma şeklimizle ilgili açıklığa ihtiyacım var. Bu sorunlu bir soru olabilir, ancak bir çalıştırılabilir dosya ile çalıştırma arasındaki fark nedir ./an_executableve . an_executable(varsayalım bulunduğu yerde olduğumuzu varsayalım)

Zaten eski kabuk ( .) geçerli dizinde an_executable için arama yapar , ancak ikinci sürümü kullandıktan /sonra neden gerekli olmadığını biliyorum zaten .?

Şimdiden teşekkürler.


Yanıtlar:


22

. executableSözdizimi sadece herhangi çalıştırılabilir ile çalışmak (veya bunu yapar?) Gelmez. Bunun yerine, bu sourceyerleşik bash için bir takma addır . Bu yüzden fark çoğunlukla bash betikleriyle ilgilidir ve gerçek şu ki tamamen farklı şeylerdir :)

./executableyürütülebilir dosyayı "normalde" çalıştırmayı ister. ./, geçerli yola ilişkin göreli bir başvurudur. Bu, shell'in (bash) çalıştırılabilirini kendi dizinindeki bir dizinde bulmaya çalışmasını önler ( $PATHkomutla hiç bir yol belirtmezseniz bunu yapar). Sadece yapamamanızın nedeni executablebir güvenlik; indirdiğiniz bir arşivi açtığınızı ve bu dosyanın kötü amaçlı bir sürümünü içerdiğini hayal edin ls. Doğrudan geçerli dizininizden yayınlandıysa, farkında olmadan o sürümü çalıştırırsınız.

Öte yandan, . executable"kaynak bir dosya kaynak executable" diyor. Dosyayı doğrudan adlandırdığınızdan ve gerçekten yürütülebilir bir dosya olması gerekmediğinden, $ PATH için güvenlik kısıtlaması geçerli değildir. Kaynak kullanımı yalnızca kabuk komut dosyalarını "çalıştırır" (veya çalıştırıyor gibi görünür). Yaptığı şey:

   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.

Peki ... Gerçekte yürütme ve kaynak sağlama arasındaki fark nedir? Aynı kabuk betiğini varsayarsak, ( ./script) yürütmek yeni bir kabuk oluşturacak, betiği o kabuğun içinde çalıştıracak ve betiği çıkınca o kabuğu kapatacak ve üst kabuğa dönecektir. Aslında bash, komut dosyasını yürütmek için yeni bir işlem başlatacaktır ).

( . script) geçerli kabuğun komut satırında yazılıyormuş gibi komutları dosyadan okumasına neden olur . Yeni bir kabuk ortaya çıkmadı.

Bunun nasıl davrandığını görmenin çok kolay bir yolu, yalnızca içeren bir komut dosyası yazmaktır exit. Bunu yaparsanız ./script, hiçbir şey olmayacak gibi görünüyor, bunun nedeni yeni bir kabuk işleminin başlatılması, exitkomutun yeni kabuktan çıkması ve geçerli kabuğunuzun etkilenmemesidir.

Eğer varsa . script, geçerli terminali kapanacak, çünkü exitşimdiki kabuğunda komut çalışır. Bu exit, komut isteminde yazmakla eşdeğerdir .


Gerçekten, bu davranışı fark ettiğimde kabuk komut dosyası ile uğraşıyordum. Çok teşekkür ederim, ihtiyacım olan cevap bu. :)
zipzap

başka bir soru kaldırdı (sakıncası yoksa): benim komut yankı ile sadece bazı basit mesajlar içeriyorsa ve ben ./script ile çalıştırıyorsanız, o zaman neden alt kabuk kapanırsa üst kabuktaki iletileri görebiliyorum infaz biter bitmez?
zipzap

2
Çünkü alt kabuk ayrı bir işlem olsa da, çağrılan kabukla aynı terminali kullanır . lsÇıktıyı hala nasıl görebileceğinize benzer : komutu yazıyorsunuz, çalışıyor, çıktıyı gösteriyor ve sonra bitiyor, ancak çıkış terminalde kalıyor.
roadmr

2
Kabuğu terminalle karıştırmayın; onlar farklı şeyler. Bir terminal açın ve komut istemi bashiçinde çalışan bir kabuk tarafından verilir . Eğer yazarsanız bash, başka bir kabuk çalıştırırsınız ; ilk kabuk için, sadece çalıştırılacak bir program. Yazdığınızda exit, başlattığınız son kabuğu kapatırsınız ancak yine de ilk kabukta (terminali başlattığınız andan itibaren) kalırsınız. Yine, bunların hepsi aynı terminalde gerçekleşir.
roadmr

1
@DavidZ Bahsetmiştim :) "Kaynaklar kabuk betiklerini sadece" çalıştıracak "(veya çalışıyor gibi görünecek)."
roadmr
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.