Chương trình của tôi không thể chạy với lệnh không tìm thấy lỗi


15

Tôi vừa chuyển từ Windows sang Ubuntu 11.10.

Tôi đã viết đoạn mã sau bằng C với trình soạn thảo văn bản và lưu nó dưới dạng HelloWorld.c trong Documents.

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

Và tôi khởi động Terminal và nhập các lệnh sau:

cd Documents

gcc HelloWorld.c

Một tệp có tên a.out, sau một số tìm kiếm trên Google, là tệp thực thi. Tôi đã nhập lệnh này:

a.out

Nhưng tôi hiểu

a.out: command not found

Bước nào tôi đã làm sai?


Đừng quên làm cho nó có thể thực thi được, sử dụngsudo chmod 777 a.out
Nick Shvelidze

@NickShvelidze Trình biên dịch khá nhiều luôn được đặt +xcho bạn; bạn không cần phải chmodthực thi được tạo bởi trình biên dịch. Tình huống phổ biến duy nhất gcckhông thể thực hiện được là nếu nó tạo tệp trong hệ thống tệp không hỗ trợ hoặc cho phép tệp (trong trường hợp chmodđó ngay sau đó cũng sẽ thất bại). Ngoài ra, 777nên tránh. Không cần phải làm cho nó có thể đọc, ghi và thực thi được bởi tất cả người dùng; nếu nó cần thiết để chạy chmod, thì chmod +x a.outsẽ là đủ.
Eliah Kagan

Câu trả lời:


33

Vì bạn đang chạy một tệp thực thi trong thư mục làm việc hiện tại, bạn nên đặt tiền tố cho nó ./. Vì vậy, cho chương trình của bạn chạy nó như là ./a.out.

Giải trình

Các thiết bị đầu cuối tìm kiếm thực thi trong $PATH. Đây là một Unix biến môi trường mà danh sách thư mục chứa tập tin nhị phân hệ thống (ví dụ như ls, echohoặc gcc). Nếu bạn gọi một tệp thực thi không có trong một $PATHthư mục (chẳng hạn như a.out), bạn cần chỉ ra đường dẫn tuyệt đối của nó trong hệ thống tệp.

Trong thiết bị đầu cuối .là một từ đồng nghĩa cho thư mục làm việc hiện tại, do đó ./a.out. Bạn cũng có thể gọi như nhau /home/yihang/Documents/a.out.


1
Để giải thích thêm về điều này, lệnh "./" đóng vai trò là lệnh "ngay tại đây". Nó hơi dư thừa, nhưng hữu ích theo nghĩa bạn biết bạn sẽ thực hiện một cái gì đó.
Ruben Bakker

1
Bạn cũng có thể cần chmod u+x a.outphải cho phép hệ thống thực thi nó.
charlesbridge

Bây giờ tôi nhận được nó với "./". Chương trình chạy tốt mà không cần chmod. Cảm ơn.
yihangho

1
@yihang: Vui lòng xem xét để đánh dấu câu hỏi này như đã trả lời, bằng cách nhấp vào vòng tròn màu xám / xanh lá cây ở phía bên trái của câu trả lời bạn thích nhất.
Rafał Cieślak

@Ruben Bakker: Thật ra, nó hoàn toàn không dư thừa. Không giống như Windows, Linux không mặc định tìm trong thư mục hiện tại hoặc mặc định. Vì vậy, nếu nó không nằm trong đường dẫn, bạn cần chỉ định thư mục, bất kể đó là gì.
Marty Fried

9

Khi bạn chạy các lệnh trên Linux, nó sẽ tìm kiếm tất cả các thư mục được liệt kê trong PATHbiến môi trường và nếu nó không tìm thấy lệnh ở đó thì bạn sẽ nhận được thông báo mà bạn đã thấy.

Thông thường nó trông như thế này:

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

Điều đó có nghĩa là nó sẽ nhìn đầu tiên trong /usr/local/bin. Nếu nó không tìm thấy nó, nó sẽ nhìn vào /usr/bin, vân vân.

Trên thực tế, điều này rất giống với DOS / Windows: có một biến được gọi là %PATH%chính xác điều tương tự.

Sự khác biệt là, trên Windows, thư mục hiện tại cũng được tìm kiếm. Unix coi điều này là xấu vì một tệp cục bộ (như phần mềm độc hại) có thể vô tình ghi đè lên các chương trình hệ thống quan trọng.

Nếu bạn thích điều đó, bạn có thể làm cho Linux hoạt động theo cách tương tự bằng cách thêm .vào đường dẫn:

PATH=.:$PATH

(Điều đó nói rằng được đặt PATHthành .:cộng với nội dung hiện có của $PATH.)

Nó kết thúc giống như thế này (nó có thể khác trên máy của bạn):

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

Nếu bạn không muốn làm điều đó, bạn chỉ cần chạy từng chương trình bằng cách chỉ định rõ ràng thư mục:

./myprog

hoặc là

/home/username/myprog

2
Nếu bạn thêm .vào PATH, luôn luôn thêm nó cuối cùng.
muru

3

Về cơ bản, a.out được tạo theo mặc định vì bạn không chỉ định tên cho tệp thực thi. Hãy thử điều này thay thế:

gcc HelloWorld.c -o HelloWorld

Khi bạn làm điều đó, bạn sẽ có thể gọi nó bằng cách (như Sunil đề xuất) mở đầu "HelloWorld" bằng dấu gạch chéo (./):

./HelloWorld

Đây là một liên kết đến một bài viết giải thích một chút về lý do tại sao a.out được tạo: Viết và biên dịch chương trình C trên Linux .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.