Programım "komut bulunamadı" hatasıyla çalışamıyor


14

Windows'tan Ubuntu 11.10'a geçtim.

Aşağıdaki kodu metin düzenleyicisiyle C'ye yazdım ve bunu Documents'a HelloWorld.c olarak kaydettim.

#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}

Terminal'i başlattım ve aşağıdaki komutları girdim:

cd Documents

gcc HelloWorld.c

Google'da bazı aramalardan sonra yürütülebilir olan a.out adlı dosya. Bu komutu girdim:

a.out

Ama anladım

a.out: command not found

Hangi adımı yanlış yaptım?


Yürütülebilir hale getirmeyi unutmayın, kullanınsudo chmod 777 a.out
Nick Shvelidze

@NickShvelidze Derleyiciler her zaman +xsizin için ayarlanmış ; chmodbir derleyici tarafından üretilen yürütülebilir dosya gerekmez . gccYürütülemediğinde yaygın olan tek durum , dosyayı desteklemeyen veya izin vermeyen bir dosya sisteminde oluşturmasıdır (bu durumda chmodhemen sonra da başarısız olur). Ayrıca, 777kaçınılmalıdır. Tüm kullanıcılar tarafından okunabilir, yazılabilir ve yürütülebilir hale getirilmesine gerek yoktur; o takdirde vardı çalıştırmak için gerekli chmod, o zaman chmod +x a.outyeterli olacaktır.
Eliah Kagan

Yanıtlar:


33

Geçerli çalışma dizininde bir yürütülebilir dosya çalıştırdığınız için, önüne önek eklemelisiniz ./. Yani programınız için çalıştırın ./a.out.

açıklama

Terminal, içindeki yürütülebilir dosyaları arar $PATH. Bu Unix ortam değişkeni sistemin ikili içeren listeler dizinler (örneğin ls, echoya da gcc). Bir dizinde olmayan bir yürütülebilir dosyayı $PATH(örneğin a.out) çağırırsanız , dosya sisteminde mutlak yolunu belirtmeniz gerekir.

Terminalde .mevcut çalışma dizini ile eşanlamlıdır ./a.out. Eşit derecede iyi çağrı yapabilirsiniz /home/yihang/Documents/a.out.


1
Bu konuyla ilgili daha ayrıntılı bilgi için, "./" bir "tam burada" komutu olarak işlev görür. Biraz gereksiz, ama bir şey yapacağınızı bildiğiniz için faydalı.
Ruben Bakker

1
chmod u+x a.outSistemin çalışmasına da izin vermeniz gerekebilir .
charlesbridge

Şimdi "./" ile anlıyorum. Program chmod olmadan iyi çalışır. Teşekkürler.
yihangho

1
@yihang: Lütfen en çok beğendiğiniz yanıtın sol tarafındaki gri / yeşil daireyi tıklayarak bu soruyu yanıtlandı olarak işaretlemeyi düşünün.
Rafał Cieślak

@Ruben Bakker: Aslında, hiç gereksiz değil. Windows'tan farklı olarak, Linux varsayılan olarak geçerli veya varsayılan dizine bakmaz. Bu nedenle, yolda değilse, dizini ne olursa olsun belirtmeniz gerekir.
Marty Fried

9

Linux'ta komutları çalıştırdığınızda, PATHortam değişkeninde listelenen tüm dizinleri arar ve oradaki komutu bulamazsa, gördüğünüz mesajı alırsınız.

Genellikle şöyle görünür:

PATH=/usr/local/bin:/usr/bin:/bin

Bu, önce bakacağı anlamına gelir /usr/local/bin. Orada bulamazsa, içeriye bakar /usr/binve böyle devam eder.

Aslında, bu DOS / Windows'da çok benzer: %PATH%tam olarak aynı şeyi yapan bir değişken var .

Fark Windows üzerinde, geçerli dizin de aranır, olmasıdır. Yerel bir dosya (kötü amaçlı yazılım gibi) önemli sistem programlarını yanlışlıkla geçersiz kılabildiği için Unix bunu kötü görür.

Bunu tercih ederseniz, Linux'u aynı şekilde çalıştırarak . :

PATH=.:$PATH

(Set diyor PATH etmek .:artı mevcut içerikleri $PATH.)

Bunun gibi bir şeye benziyor (makinenizde farklı olabilir):

PATH=.:/usr/local/bin:/usr/bin:/bin

Bunu yapmak istemiyorsanız, dizini açıkça belirterek her programı çalıştırabilirsiniz:

./myprog

veya

/home/username/myprog

2
Eklemek yoksa .üzere PATH, her zaman son ekleyin.
muru

3

Esas olarak, yürütülebilir dosya için bir ad belirtmediğiniz için a.out varsayılan olarak oluşturulur. Bunun yerine şunu deneyin:

gcc HelloWorld.c -o HelloWorld

Bunu yaptıktan sonra, bir nokta eğik çizgi (./) ile "HelloWorld" e yaklaşarak (Sunil'in önerdiği gibi) onu çağırabilirsiniz:

./HelloWorld

İşte a.out'un neden oluşturulduğu hakkında biraz açıklayan bir makaleye bağlantı: Linux'ta C Programları Yazma ve Derleme .

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.