Bir C programını yürütürken a.out
, Ubuntu terminalini kullanarak, neden sadece yazmak yerine her zaman ./
önce a.out
yazmam gerekir a.out
? Bunun için bir çözüm var mı?
Bir C programını yürütürken a.out
, Ubuntu terminalini kullanarak, neden sadece yazmak yerine her zaman ./
önce a.out
yazmam gerekir a.out
? Bunun için bir çözüm var mı?
Yanıtlar:
a.out
Sistem gibi bir programın adını yazdığınızda PATH'nizdeki dosyayı arar. Benim sistemimde, PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Seninki muhtemelen benzer. Kontrol etmek için echo $PATH
bir terminal girin .
Sistem bu dizinlere verilen sıra ile bakar ve bulamazsa, program bir command not found
hata üretir .
Komutu ./
etkin bir şekilde hazırlamak "YOLU unut, sadece şu anki dizine bakmanı istiyorum" diyor.
Benzer şekilde, komutu aşağıdaki gibi göreceli veya mutlak bir yolla hazırlayarak sisteme yalnızca belirli bir konuma bakmasını söyleyebilirsiniz:
../
üst dizindeki araç anlamına gelir; örneğin, üst dizinde ../hello
merhaba arayın.
./Debug/hello
: " hello
Geçerli dizimin Debug alt dizininde arayın ."
veya /bin/ls
: " ls
dizinde ara /bin
"
Varsayılan olarak, geçerli dizin yolda değildir, çünkü bu bir güvenlik riskidir. Neden olduğunu görün . varsayılan olarak yolda değil misiniz? Süper kullanıcı için neden.
Geçerli dizini PATH'inize eklemek mümkündür, ancak bağlantılı soruda verilen nedenlerden dolayı bunu tavsiye etmem.
.
adresinden Müşteri PATH
(diğer 2 cevaplar şu anda önerdiği gibi) nedeniyle bu cevapta belirtildiği güvenlik riskine.
.
yürütülebilir bir örneğin tam veya göreli yolu kullanabilir, burada /home/user/foo/a.out
ya./build/a.out
.
özeldir çünkü "şu anki dizinim" anlamına gelir ve kullanıcının okuma ve çalıştırma ayrıcalıklarıyla kendilerini bulabildiği herhangi bir dizin olabilir. Bu, belirli bir tam nitelikli yolu eklemekten potansiyel olarak daha tehlikelidir.
.
böylesi daha iyi başlayabiliriz sadece bir yol, hiçbir özel statü tutan /
ve ./blah
sadece de çalışmak cat
veya grep
bir bash isteminde olarak.
Bunun nedeni basit.
Geçerli dizindeki bir uygulamayla aynı ada sahip bir komutunuz olduğunu varsayalım. Daha sonra komutu kabukta çalıştırmak, yerleşik komut yerine uygulamanızı çağırır . Başka bir şey olmazsa, bu bir güvenlik endişesi olacaktır.
./
Önde kullanılmasını gerektiren kabuk, uygulamayı bu adla yerleşik bir komutla değil, verilen adla yürütmek istediğinizi bilir.
./
içinde olmayan dosyaları $PATH
çalıştırır, dosyayı geçerli dizinde (veya başka bir yolla ./home/stefano/script.sh
) çalıştırır. Şimdi PATH, bash'ın çalıştırılabilir programları arayabileceği, bunlara tam (mutlak) bir yol girmeden tüm yerleri içeren bir ortam değişkenidir.
Bu dosyanın yanlış çalışmasını önlemek için gereklidir. Yani ls
, ana dizininizde adı verilen bir dosyanız varsa , PATH'inizde bulunmamak bash ile gerçek olanın karışmasını önler ls
. PATH değişkeni ayrıca arama sırasını tanımlar:
exec
çağrı yapmaya çalıştığında (Çekirdeğin özel bir yöntemi, programların nasıl başlatıldığı), sistem PATH'nizdeki her bir dizini gözden geçirerek dosyayı arar. Program bulunduktan sonra, birden fazla klasörde olsa bile, arama durdurulur ve ilk bulunan çalıştırılır.Bir dosyayı çalıştırmak için çalıştırılabilir biti izinlerde ayarlamanız gerekir:
Zaten komut satırında olduğunuzdan, sadece yazabilirsiniz chmod +x finename
.
Veya izinleri dosyayı sağ tıklatarak ve Özellikler'i seçerek ayarlayabilirsiniz :
Şimdi dosyayı, PATH içindeki dizinlerden herhangi birine kopyalayabilir, hangilerinin orada olduğunu ve kullanıcı bazında ayarlandıklarını görebilirsiniz echo $PATH
.
stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Yürütülebilir bir dosya oluşturup cat
onu taşırsanız /usr/local/sbin
, içinde uygun cat
olanın yerine çalıştırılır /bin
. Dosyalarınızı kullanarak nerede öğrenebilirsiniz type cat
ve whereis cat
.
gcc
, yürütme bitini otomatik olarak ayarlayan bir şeyi derlediğini ve ilişkilendirdiğini gösteriyor .
./
Bir programı yürütmeden önce neden yazmaya ihtiyacınız var ?Terminalde, bir uygulamanın adını ne zaman yazsanız, diyelim ki gedit
terminal uygulamaları içeren (önceden tanımlanmış) dizinlere bakacaktır (uygulamaların ikilileri). Bu dizinlerin isimleri denilen bir değişkende bulunur PATH
. Bu değişkende ne olduğunu çalıştırarak görebilirsiniz echo $PATH
. Bu rehberler ile ayrılmış bakın :
? Bunlar uç sadece yazarsanız, arama gidecek dizinleri vardır gedit
, nautilus
ya a.out
. Gördüğünüz gibi, a.out
programın yolu orada değil. Bunu yaptığınızda ./a.out
, terminale "şu anki dizine bakın ve çalıştırın a.out
ve içeri bakmayın PATH
.
./
Her seferinde yazmak istemiyorsanız , a.out
dizinini de eklemeniz gerekir $PATH
. Aşağıdaki talimatlarda, yolun doğru a.out
olduğunu kabul edeceğim /path/to/programs/
, ancak onu gerçek yolunuzla değiştirmelisiniz.
Dosyanın sonuna aşağıdaki satırı eklemeniz yeterlidir ~/.pam_environment
:
PATH DEFAULT=${PATH}:/path/to/programs
Kaynak: Kalıcı çevre değişkenleri
Çıkış yapın ve tekrar giriş yapın. Artık herhangi bir dizinden çalışmadan a.out
çalışabileceksiniz ./
.
Başka dizinlerde başka programlarınız varsa, bunları sadece yukarıdaki satıra ekleyebilirsiniz. Ancak, örneğin "myPrograms" adlı bir dizine sahip olmanızı ve tüm programlarınızı altına koymanızı öneririm.
Not: değiştirmek
userName
gerçek Ubuntu kullanıcı adına.
Ya çalıştırmak istediğiniz başka programlarınız varsa? Ve hepsi farklı klasörlerde mi? Eh, "daha organize" bir çözüm bin
Home dizininizin altında bir klasör oluşturmak ve bu klasörün altına sembolik bağlantılar (kısayollar) eklemek olacaktır. İşte nasıl:
mkdir /home/userName/bin
bin
Giriş dizininizin altındaki klasörü oluşturur .ln -s /path/to/programs/a.out /home/userName/bin
a.out
programınızın altında "sembolik bir bağlantı" (temel olarak bir kısayol) yaratacaktır bin
.Çıkış yapın ve tekrar giriş yapın. Artık herhangi bir dizinden çalışmadan a.out
çalışabileceksiniz ./
.
Şimdi, başka bir yerde ne zaman başka bir programınız varsa, diyelim ki b.in
Masaüstünüzdeki programı , yapmanız gereken tek şey: ln -s /home/userName/Desktop/b.in /home/userName/bin
ve daha sonra programı çalıştıramazsınız ./
.
Not: @ Joe'nun yorumu sayesinde , yedekleme yaparken sembolik bağlantıların özel olarak ele alınması gerekir. Varsayılan olarak,
rsync
onları hiç işlemez, bu nedenle geri yüklediğinizde orada olmazlar.
George'un cevabında işaret ettiği gibi, bu , geçerli çalışma dizininde ( ) bir dosyayı çalıştırdığınızı not etmenize yardımcı olur pwd
.
Ben önce benim kıdemli uzun zamandır bu soruyu soran hatırlıyorum, o ben eklemek gerektiğini söyledi .
yaptığımda böylece benim yoluna a.out
geçerli dizinde arar ve bu yürütür. Bu durumda yapmak zorunda değilim ./a.out
.
Ancak, şahsen buna karşı öneriyorum. Bana asla olmadı, ama yabancı bir ağ dizinindeyseniz veya ls
orada adı geçen kötü amaçlı bir çalıştırılabilir dosya varsa, yolunuzda olması .
çok kötü bir fikirdir. Sadece bu soruna sıkça rastlayacağınızı değil, sadece söyleyerek.
.
için $PATH
. Çok tehlikeli bir fikir.
Diğer cevaplara ek olarak, burada bu konuyu man bash
iyi açıklayan temel kısım :
KOMUTANLI YÜRÜTME Bir komut kelimelerle bölündükten sonra, basit bir sonuç verirse komut ve isteğe bağlı bir argüman listesi alınmış. Komut adında eğik çizgi yoksa, kabuk bulmaya çalışır o. Bu ada sahip bir kabuk işlevi varsa, bu işlev FONKSİYONLAR'da yukarıda açıklandığı gibi çağrılır. İsim eşleşmiyorsa işlevi, kabuk, kabuk yerleşik listesi listesinde arar. Eğer bir eşleşme bulunur, bu yerleşik çağrılır. Ad, bir kabuk işlevi veya bir yerleşik değil ise, eğik çizgi, bash PATH öğesinin her öğesini con dizini için arar. bu ada göre çalıştırılabilir bir dosyayı etiketlemek.
Bir './' sizin için bilinen ve belirli bir programı, örneğin kendi programınızı çalıştırdığınızda anlamlıdır. Bu program mevcut dizinde bulunmalıdır. $ PATH içindeki bir yerde standart bir komut çalıştırdığınızda './' bir anlam ifade etmiyor. "Hangi komuttan çalıştırma" komutu size hangi komutun çalıştırılacağını $ PATH içinde gösterir.
$ gcc hello.c -o /path/to/someplace/hello
bazı yerlerde bir çalıştırılabilir dosya üretecek. Bu konum yolunuzdaysa, dosyayı çalıştırabilirsiniz. "Gcc kullanarak bu kaynak kodunu derleyin ve yolundaki bir yere bir çalıştırılabilir dosya yerleştirin" eylemi için bir etiket oluşturmak istiyorsanız bunu yazabilirsiniz.
"Testbin" ya da bu tür bir şey adı verilen yeni bir dizin oluşturmanızı ve mevcut yol dizinlerinizi temiz tutmak için yolunuza koymanızı öneririm.
./
yol için gereksiz aramaları engeller. ./
Sadece geçerli dizinde aramaya zorla. Biz vermezsem ./
o zaman böyle sisteme set çeşitli yolunu arayacaktır /usr/bin
, /usr/sbin/
vb
"./", geçerli dizindeki bir dosyayı yürütmek istediğinizi, bu yolun tamamını yazmak için bir kısayol olduğunu belirtir.
[root@server ~]#/path/to/file/file.pl
aynıdır:
[root@server file]#./file.pl
önceki örnekte dizini ve alt dizinlerini dosya konumuna getirdiniz ve dosyayı geçerli dizinde çalıştırmak için "./" kullandınız.
ondan önceki " [root @ server ~] # / path / to / file / file.pl " ayrıca, dosya konumuna giderken yolunuz "cd" ye tembelseniz de dosyayı çalıştıracaktır.
Çok basit ve birçok kullanım alanı var.
/usr/bin
. Örneğin, Python 2.7, Python 2.6 kurulur ancak / usr / bin / python -> python2.7 / usr / yerel / bin / python -> python2.6Yolun /usr/local/bin
içindeyseniz ve Python'u çalıştırırsanız, daima Python 2.7'yi çalıştırır. Belirtilmesi .
, geçerli klasörün yürütülebilir dosyasını alacaktır.
.
- daima geçerli dizinden yürütmeyi temsil eder. Ve ..
her zaman önceki dizinden yürütür anlamına gelir.