Program saya tidak dapat berjalan dengan kesalahan "command not found"

15

Saya baru saja beralih dari Windows ke Ubuntu 11.10.

Saya menulis kode berikut dalam C dengan editor teks dan menyimpannya sebagai HelloWorld.c di Dokumen.

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

Dan saya memulai Terminal dan memasukkan perintah berikut:

cd Documents

gcc HelloWorld.c

File bernama a.out, yang, setelah beberapa pencarian di Google, dapat dieksekusi. Saya memasukkan perintah ini:

a.out

Tapi saya mengerti

a.out: command not found

Langkah mana yang saya lakukan salah?

yihangho
sumber
Jangan lupa untuk membuatnya dieksekusi, gunakansudo chmod 777 a.out
Nick Shvelidze
@NickShvelidze Compiler hampir selalu ditetapkan +xuntuk Anda; Anda tidak perlu chmodmengeksekusi yang dihasilkan oleh kompiler. Satu-satunya situasi umum di mana gccgagal untuk membuatnya dapat dieksekusi adalah jika itu membuat file dalam sistem file yang tidak mendukung atau mengizinkannya (dalam hal ini chmodsegera setelah itu akan gagal juga). Juga, 777harus dihindari. Tidak perlu membuatnya dapat dibaca, ditulis, dan dieksekusi oleh semua pengguna; jika itu diperlukan untuk menjalankan chmod, maka chmod +x a.outakan cukup.
Eliah Kagan

Jawaban:

33

Karena Anda menjalankan executable di direktori kerja saat ini, Anda harus mengawali dengan ./. Jadi untuk program Anda jalankan sebagai./a.out .

Penjelasan

Terminal mencari executable di $PATH. Ini adalah Unix variabel lingkungan yang daftar direktori yang berisi sistem biner (seperti ls, echo, atau gcc). Jika Anda memanggil executable yang tidak ada dalam $PATHdirektori (sepertia.out ), Anda perlu menunjukkan path absolutnya dalam sistem file.

Di terminal .adalah sinonim untuk direktori kerja saat ini, dengan demikian ./a.out. Anda juga bisa menelepon /home/yihang/Documents/a.out.

0x0
sumber
1
Untuk menjelaskan lebih lanjut tentang ini, perintah "./" berfungsi sebagai "di sini",. Ini agak berlebihan, tetapi berguna dalam arti bahwa Anda tahu Anda akan mengeksekusi sesuatu.
Ruben Bakker
1
Anda mungkin juga perlu chmod u+x a.outmengizinkan sistem untuk menjalankannya.
charlesbridge
Sekarang saya mendapatkannya dengan "./". Program berjalan dengan baik tanpa chmod. Terima kasih.
yihangho
1
@yihang: Harap pertimbangkan untuk menandai pertanyaan ini sebagai dijawab, dengan mengklik lingkaran abu-abu / hijau di sisi kiri jawaban yang paling Anda sukai.
Rafał Cieślak
@Ruben Bakker: Sebenarnya, itu sama sekali tidak berlebihan. Tidak seperti Windows, Linux tidak default untuk mencari di direktori saat ini, atau default. Jadi, jika tidak ada di jalur, Anda perlu menentukan direktori, apa pun itu.
Marty Fried
9

Ketika Anda menjalankan perintah di Linux, ia akan mencari semua direktori yang tercantum dalam PATHvariabel lingkungan, dan jika tidak menemukan perintah di sana, maka Anda mendapatkan pesan yang Anda lihat.

Biasanya terlihat seperti ini:

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

Itu berarti akan terlihat pertama di /usr/local/bin. Jika tidak menemukannya di sana akan terlihat /usr/bin, dan sebagainya.

Sebenarnya, ini sangat mirip pada DOS / Windows: ada variabel yang disebut %PATH% yang melakukan hal yang persis sama.

The perbedaan adalah bahwa, pada Windows, direktori saat ini juga dicari. Unix menganggap ini buruk karena file lokal (seperti malware) dapat menimpa program sistem penting secara tidak sengaja.

Jika Anda lebih suka itu, Anda bisa membuat Linux bekerja dengan cara yang sama dengan menambahkan .path:

PATH=.:$PATH

(Itu mengatakan set PATHke .:ditambah konten yang ada $PATH.)

Akhirnya terlihat seperti ini (mungkin berbeda pada mesin Anda):

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

Jika Anda lebih suka tidak melakukannya, Anda bisa menjalankan setiap program dengan menentukan direktori secara eksplisit:

./myprog

atau

/home/username/myprog
am
sumber
2
Jika Anda menambahkan .untuk PATH, selalu menambahkannya lalu.
muru
3

Pada dasarnya, a.out dibuat secara default karena Anda tidak menentukan nama untuk dieksekusi. Coba ini sebagai gantinya:

gcc HelloWorld.c -o HelloWorld

Setelah Anda melakukan itu, Anda harus dapat memohonnya dengan (seperti yang disarankan Sunil) dengan prefacing "HelloWorld" dengan dot-slash (./):

./HelloWorld

Berikut ini tautan ke artikel yang menjelaskan sedikit tentang mengapa a.out dibuat: Menulis dan Mengkompilasi Program C di Linux .

Harun
sumber