Bir dosyayı yürütmek için neden “./” kullanıyoruz?


84

Neden ./filenameLinux'ta bir dosyayı çalıştırmak için kullanıyoruz ?

Neden sadece diğer komutlar gibi girmeyin gcc, lsvb ...


İlk satır " Linux'ta neden ./command_namebir komut uygulamak için neden kullanıyoruz ?" Olarak yazılmıyor mu?

Yanıtlar:


78

Linux'ta UNIX ve ilgili işletim sistemleri .mevcut dizini belirtir. Geçerli dizinde bir dosyayı çalıştırmak istediğin ve o dizinde olmadığına göre , kabuğun çalıştırılabilir olduğunu söylemek için bite $PATHihtiyacın ./var. Yani, bu dizinde ./fooadı verilen çalıştırılabilir dosyayı çalıştırın foo.

Sizde bulunan komutların tam yolunu bulmak için typeveya tuşunu kullanabilirsiniz .which$PATH


5
Programları geçerli dizinde çalıştırmak çok yaygındır. Kabuk neden orada arama yapmıyor? Önce içinde arama yapar, sonra $ PATH içinde.
Michael

aliasSadece yoluna girmeyen eserler de var $PATH.
user2485710

18
@Michael güvenlik ve akıl sağlığı: .Önce aranırsa , bir güvenlik sorunu ortaya çıkar, lsörneğin siz veya başkası değiştirebilir (örneğin, basit bir virüs / trojen: lsiçinde arama yapan bir zip dosyası hazırlayabilirsiniz) , bu yürütülebilir dosyayı çalıştırıyorlar, ki…). İçeri arama yaparsa .son o zaman (bunun yerine sistem test programı çalıştırır programınızı çalışan, örneğin test adlı bir program yapmak. Hiçbir çıktı üretir hangisi) program neden çalışmadığını deli bilmeden gidiş uzun zaman geçirebilirsiniz.
ctrl-alt-delor

Ayrıca, uygulama veya komut dosyası yolunuzda birden çok kez görünüyorsa, çalıştırmayı düşündüğünüz sürümü çalıştırmanızı sağlar (burada "." Dizininizdeki).
Jim2B

export PATH="$PATH:."
PATH'ta

99

Kelimenin tam anlamıyla cevabı, diğerlerinin verdiği gibi: çünkü geçerli dizin sizin değil $PATH.

Ama neden Kısacası, güvenlik için. Başkasının ana dizinine (veya / tmp) bakıyorsanız ve sadece yazın gccveya ls, gerçek olanı çalıştırdığınızı bilmek istiyorsanız, şaka sahibi arkadaşınızın tüm dosyalarınızı silen yazdığı kötü amaçlı bir sürümü değil. Başka bir örnek olacağını testya [da kabuk yerleşik ins sıra bu yoksa, kabuk komut bu komutları geçersiz olabilir.

Having .olarak son yolunuzda girişi biraz daha güvenli, ama bu faydalanmak diğer saldırılar vardır. Kolay olan, slya da gibi ortak yazım hatalarından yararlanmaktır ls-l. Veya, bu sisteme yüklenmemiş olan ortak bir komut bulun - vimörneğin, sysadmins bunu yazmak için ortalamanın üzerinde bir olasılık olduğundan.


5
Bununla ısırılan birinin pratik bir örneği: unix.stackexchange.com/questions/7767
mattdm

Sadece PATHortam değişkeninde mutlak yollar var .
Ed Heal,

45

Yani, niçin ihtiyaç duyduğunuza ihtiyaç duyuyorsunuz? / Başlangıçta - bunun nedeni (Windows'taki aksine), geçerli dizinin varsayılan olarak yolunuzun bir parçası olmamasıdır. Eğer koşarsan:

$ ls

kabuğunuz lsPATH ortam değişkeninizdeki dizinleri arar ( echo $PATHgörmek için) ve lsbulduğu ilk çalıştırılabilir dosyayı çalıştırır . Eğer yazarsanız:

$ a.out

Kabuk da aynı şekilde yapacaktır - fakat muhtemelen a.out adında bir çalıştırılabilir dosya bulamaz. Kabuğa a.out'un nerede olduğunu - o anki dizinde (.) Var ve sonra yol ./a.out.

Neden "a.out" dendiğini soruyorsanız, bu sadece gcc için varsayılan çıktı dosya adıdır. -O komut satırı argümanıyla değiştirebilirsiniz. Örneğin:

$ gcc test.c -o test
$ ./test

Teşekkürler. Şüphe, neden ihtiyacınız var. / Başlangıçta .... Ben "." (geçerli dizine bakmak için) fakat bundan sonra neden "/"?
Renjith G

8
/, Linux'ta yol ayırıcı olduğundan, dizini (.) dosya adından (a.out) ayırmak için kullanırsınız. Onsuz, kendi başına geçerli bir dosya adı olan .a.out'a sahipsiniz. (Bunu touch .a.out; ls -lAgörmeye çalışın .)
Simon Whitaker

5
Unix'te yolu bu şekilde belirlersiniz, <dir>/<file>bu nedenle temel olarak geçerli dizinde bir dosyayı çalıştırdığınızı söylüyorsunuz./test
Rohan Monga

Red Hat Linux 9 (Shrike) Kernel 2.4.20-8 i686 [renjithg @ cvsserver renjithg] $ touch.a.out hakkinda; : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 Kasım 30 13:46 a.out -rw-RW-r-- 1 renjithg renjithg 218 24 Ağustos 2009 aray.c [renjithg @ cvsserver renjithg] $
renjith G

3
Red Hat Linux 9 mu? Yükseltme zamanı!
mattdm

4

:.$ PATH değişkeninize eklemeyi deneyebilirsiniz .

ALT + F2'yi deneyin ve şunu yazın: gksudo gedit /etc/environmentLinux / GTK kullanıyorsanız (Ubuntu kullanıyorsanız bu var).

Ancak, bunu yapmamanızı şiddetle tavsiye ederim. Kötü kötü kötü ve kötü.

Bilirsin, bu tür şeyler 1970’ten beri böyle çalışır. Geçerli dizinin $ PATH’de bulunmamasının bir nedeni vardır.

. geçerli dizin

.somethingGizli bir dosya (Nautilus'ta görünmelerini sağlamak için "ALT +" yazın veya " ls -la" deneyin .

./someProgram.sh Geçerli dizinde bir çalıştırılabilir someProgram.sh çalıştırmak için yazdığınız şeydir.

.somethingElse Geçerli dizinde gizli bir yürütülebilir dosyaya sahip olduğunuz anlamına gelir, ki bu kötü bir fikirdir.

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.