Geçerli dizinde bir program yürütmeden önce neden './' yazmam gerekiyor?

86

Bir C programını yürütürken, Ubuntu terminalini kullanarak a.out , neden ./ yazıyor yerine a.out önce a.out yazmalıyım? Bunun için çözüm var mı?

    
sordu Prashant Chikhalkar 16.07.2013 13:58

10 cevap

113

a.out gibi bir programın adını yazdığınızda, sistem PATH'nizdeki dosyayı arar. Sistemimde PATH,

olarak ayarlandı
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Sizinki muhtemelen benzer. Kontrol etmek için, bir terminalde echo $PATH değerini girin.

Sistem verilen sırayla bu dizinlere bakar ve programı bulamazsanız bir command not found hatayı üretir.

./ ile komutu önüne eklenmesi etkili şekilde "Ben sadece geçerli dizinde bakmak istiyorum, PATH unutun" diyor.

Aynı şekilde bir akraba veya mutlak yolu gibi olan komutu ekleyerek bu sadece başka özel bir konumda bakmak için sisteme söyleyebilir

../ , üst dizinde, örneğin ../hello , üst dizinde merhaba anlamına gelir.

./Debug/hello : "Benim şimdiki dizinin ayıklama alt dizininde hello aramaya"

ya /bin/ls : "dizin ls olarak /bin aramaya"

Varsayılan olarak, geçerli dizin bir güvenlik riski olduğu için yolda değil. Neden olduğunu görün. Neden varsayılan olarak? Superuser yolunda değil. .

Geçerli dizini PATH'nize eklemek mümkündür, ancak bağlantılı soruda verilen nedenlerden dolayı bunu önermem.

    
verilen cevap Warren Hill 16.07.2013 15:20
24

Bunun nedeni basit.

Mevcut dizinde bir uygulama ile aynı ada sahip bir komutunuz olduğunu varsayalım. Ardından, komutun kabukta çalıştırılması uygulamanızı yerleşik komutun yerine çağırır. Başka bir şey yoksa bu bir güvenlik sorunu olur.

Ön tarafta kullanılacak ./ 'i gerektirdiğinde, kabuk, uygulamayı belirtilen adla yerleşik olarak çalıştırmak istediğinizi ve bu ada sahip yerleşik bir komut olmadığını bilir.

    
verilen cevap Nathan Osman 16.12.2010 04:21
16

./ , $PATH değerinizde olmayan dosyaları yürütür, bunun yerine dosyayı geçerli dizinde (veya ./home/stefano/script.sh yoluyla) yürütür. Şimdi, PATH, bash'ın yürütülebilir programlara bakabileceği tüm alanları içeren, tam (mutlak) bir yola sahip olmayan bir ortam değişkeni.

Yanlış dosya çalıştırmamak için bu ayırma gereklidir. Yani ev dizininizde ls adında bir dosya varsa, PATH'nizde bulunmuyorsa, bash'ın gerçek ls ile karıştırılması engellenecektir. PATH değişkeni de arama sırasını tanımlar:

  • Bir komut çalıştırdığınızda veya bir program exec syscall (Çekirdeğin özel bir yöntemi, programların nasıl başlatıldığı) yapmaya çalışırsa, sistem PATH'nizdeki dizinlerin her birini geçerek dosyayı arar. . Program bulunduğunda, birden fazla dizinde olsa bile, arama kesilir ve bulunan ilk çalıştırılır.

Bir dosyayı çalıştırmak için, yürütülebilir biti izinlerde ayarlamanız gerekir:

  • Zaten komut satırında olduğunuzdan, chmod +x finename yazabilirsiniz.

  • Veya, dosyaları sağ tıklayıp Özellikler 'i seçerek izinleri ayarlayabilirsiniz:

Şimdi, hangilerinin içeride olduğunu görmek için PATH'deki herhangi bir dizine kopyalayabilirsiniz. Kullanıcı başına göre ayarlanırlar. echo $PATH yazın.

[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Bir yürütülebilir dosya oluşturursanız, cat ve bunu /usr/local/sbin konumuna taşıdığınızda, cat dosyasında bulunan /bin yerine bunun yerine çalışır. Dosyalarınızın nerede olduğunu type cat ve whereis cat kullanarak öğrenebilirsiniz.

    
verilen cevap Stefano Palazzo 16.12.2010 04:18
11

Bir programı çalıştırmadan önce neden ./ yazmanız gerekiyor?

terminalde olarak, bir uygulamanın adını yazdığınızda terminal uygulamaları (uygulama ikililer) içeren bazı (ön tanımlı) dizine de baktığı gidecek, en gedit diyelim. Bu dizinlerin adları PATH adlı bir değişkende bulunur. % Co_de% dosyasını yürüterek bu değişkende neler olduğunu görebilirsiniz. % Co_de% ile ayrılmış olan dizinleri görüyor musunuz? Bunlar, echo $PATH , : veya gedit yazıyorsanız, terminalin arama yapacağı dizinlerdir. Gördüğünüz gibi, nautilus programınızın yolu yok. Eğer a.out sen terminali söylüyorsun ne zaman "geçerli dizinde bakmak ve a.out çalıştırın ve ./a.out olarak bakmak gitmez.

Çözüm 1

Her zaman a.out yazmak istemiyorsanız, PATH dizinini ./ dizinine eklemeniz gerekir. Aşağıdaki talimatlarda, a.out yolunun $PATH yolunu aldığını, ancak bunu gerçek yolunuza değiştirmeniz gerektiğini varsayalım.

  1. Aşağıdaki satırı a.out dosyasının sonuna ekleyin:

    PATH DEFAULT=${PATH}:/path/to/programs
    

    Kaynak: Kalıcı ortam değişkenleri

  2. Çıkış yapın ve tekrar giriş yapın. Artık /path/to/programs/ dosyasını herhangi bir dizinden ~/.pam_environment olmadan çalıştırabileceksiniz.

Diğer dizinlerde başka programlarınız varsa, bunları yalnızca yukarıdaki satıra ekleyebilirsiniz. Ancak, örneğin "programa" adlı bir dizinin olmasını ve programlarınızın tümünü altına almanızı tavsiye ederim.

Çözüm 2

  

Not: a.out değerini gerçek Ubuntu kullanıcı adınıza değiştirin.

Çalışmak istediğiniz başka programlarınız varsa ne olur? Ve hepsi farklı klasörlerde mi? Peki, "daha düzenli" bir çözüm, Ev dizininizin altında ./ adlı bir klasör oluşturmak ve bu klasörün altında sembolik bağlantılar (kısayollar) eklemek olacaktır. İşte nasıl:

  1. userName

    • Bu, Giriş dizininizin altındaki% co_de klasörünü oluşturacaktır.
  2. bin

    • Bu, mkdir /home/userName/bin programında bin programınızın "sembolik bağlantısı" (temel olarak kısayol) oluşturacaktır.
  3. Çıkış yapın ve tekrar giriş yapın. Artık ln -s /path/to/programs/a.out /home/userName/bin dosyasını herhangi bir dizinden a.out olmadan çalıştırabileceksiniz.

% Co_de% ve daha sonra olmadan çalıştırmak mümkün olacak bin olarak: Başka hiçbir yerde başka bir program var her

Şimdi, program, a.out Masaüstünüzde, yapmanız gereken tek şey diyelim de.

  

Not: sayesinde="https://askubuntu.com/questions/320632/why-do-i-need-to-type-before-executing-a-program -in-the-current-directory # comment407979_320659 "> @ Joe'nun yorumu , yedekleme yaptığınızda, sembolik bağların özel olarak ele alınması gerekir. Varsayılan olarak, ./ bunları işlemez, böylece geri yüklediğinizde, orada değiller.

    
verilen cevap Alaa Ali 16.07.2013 15:27
1

George'un cevabında belirttiği gibi, bu, geçerli çalışma dizinindeki (<%> co_de%) bir dosyayı uygulamanızın olduğunu unutmayın.

Bu soruyu uzun süre önce üst yöneticime sorduğumu hatırlıyorum, pwd 'yi yoluma eklemem gerektiğini söyledi, böylece . ' si kullandığımda geçerli dizine bakıp bunu yürütüyorum. Bu durumda a.out yapmak zorunda değilim.

Ama kişisel olarak, buna karşı tavsiye ederim. Bana hiç olmadı, ancak yabancı bir ağ dizininde veya başka bir şeydeyseniz ve ./a.out adlı zararlı bir yürütülebilir dosya varsa, yolunuzda ls bulunması çok kötü bir fikirdir. Bu soruna sık sık rastlanmayacaksınız, sadece söylüyorsun.

    
verilen cevap Shrikant Sharat 16.12.2010 04:32
0

A './' sizin için bilinen bir programı çalıştırdığınızda anlamlıdır, örn. kendi olanı. Bu program mevcut dizininizde mevcut olmalıdır. Bir './', $ PATH içinde bir yerde bulunan standart bir komutu çalıştırdığınızda hiçbir anlam ifade etmez. "Çalıştırılacak komut" komutu, komutun çalıştırılacağı yeri $ PATH olarak belirtir.

    
verilen cevap user7346 16.12.2010 12:06
0
$ gcc hello.c -o /path/to/someplace/hello

bazı konumlarda yürütülebilir bir dosya üretecek. Bu konum yolunuzdaysa, dosyayı çalıştırabilirsiniz. Eylem için bir etiket oluşturmak isterseniz bunu "bu kaynak kodunu gcc kullanarak derleyin ve yürütülebilir bir dosyayı yolunuzdaki bazı konumlara yerleştirin" şeklindeki komut dosyasını kullanabilirsiniz.

"testbin" adlı yeni bir dizin oluşturmanızı veya bu tür bir şey oluşturmanızı ve mevcut yol dizinlerinizi temiz tutmak için yolunuza koymanızı öneririm.

    
verilen cevap Jon Kiparsky 16.07.2013 20:35
0

./ , bir yol için gereksiz aramayı ortadan kaldırır. Sadece geçerli dizinde aramak için ./ kuvvet. % Co_de% vermezsek, ./ , /usr/bin vb. Gibi sisteme ayarlanmış çeşitli yolları arar.

    
verilen cevap user175959 17.07.2013 13:11
0

"./", geçerli dizinde bir dosyayı, örneğin tüm yolu yazmak için bir kısayolu yürütmek istediğiniz anlamına gelir:

[[email protected] ~]#/path/to/file/file.pl

şununla aynı:

[[email protected] file]#./file.pl

önceki örnekte, dizin ve dizinleri boyunca dosya konumuna gittiniz ve dosyayı geçerli dizinde çalıştırmak için "./" kullandınız.

ondan önceki " [root @ server ~] # / path / to / file / file.pl " dosyaya giderken "cd" ye geçerseniz dosyayı da çalıştıracaktır. konum.

    
verilen cevap Khaled Moustafa 25.04.2014 02:20
-4

Çok basit ve çok kullanım alanı var.

  1. Aynı uygulamanın birden çok sürümü yüklendiğinde, farklı bir yolda kullanılabilir, ancak ikili dosyanızın yumuşak bir bağlantısı /usr/bin olarak oluşturulabilir. Örneğin, Python 2.7, Python 2.6 yüklenmiştir ancak / usr / bin / python - & gt; python2.7 / usr / local / bin / python - & gt; python2.6

/usr/local/bin yolundaysanız ve Python yürütürseniz, her zaman Python 2.7'yi çalıştırır. % Co_de% değerini belirtmek, geçerli klasörün yürütülebilir dosyasını alacaktır.

  1. . - daima geçerli dizinden çalıştırmayı temsil eder. Ve . her zaman bir önceki dizinden yürütme anlamına gelir.
verilen cevap Ramjee Anna 17.07.2013 11:12

Etiketlerdeki diğer soruları oku