โปรแกรมของฉันไม่สามารถรันด้วยข้อผิดพลาด“ ไม่พบคำสั่ง”


15

ฉันเพิ่งเปลี่ยนจาก Windows เป็น Ubuntu 11.10

ฉันเขียนโค้ดต่อไปนี้ใน C พร้อมโปรแกรมแก้ไขข้อความและบันทึกเป็น HelloWorld.c ในเอกสาร

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

และฉันเริ่มต้น Terminal และป้อนคำสั่งต่อไปนี้:

cd Documents

gcc HelloWorld.c

ไฟล์ชื่อ a.out ซึ่งหลังจากทำการค้นหาบน Google แล้วจะสามารถเรียกทำงานได้ ฉันป้อนคำสั่งนี้:

a.out

แต่ฉันได้

a.out: command not found

ฉันทำผิดขั้นตอนใด


อย่าลืมที่จะทำให้มันใช้งานได้ใช้sudo chmod 777 a.out
Nick Shvelidze

@NickShvelidze คอมไพเลอร์ตั้งค่าไว้+xสำหรับคุณเสมอ คุณไม่จำเป็นต้องchmodใช้โปรแกรมที่สร้างโดยคอมไพเลอร์ สถานการณ์ทั่วไปเพียงอย่างเดียวที่gccล้มเหลวในการทำให้สามารถเรียกใช้งานได้คือถ้ามันกำลังสร้างไฟล์ในระบบไฟล์ที่ไม่รองรับหรืออนุญาต (ในกรณีนี้chmodหลังจากนั้นจะล้มเหลวทันที) นอกจากนี้777ควรหลีกเลี่ยง ไม่จำเป็นต้องทำให้ผู้ใช้ทุกคนสามารถอ่านเขียนได้และปฏิบัติได้ ถ้ามันเป็นสิ่งจำเป็นในการทำงานchmodแล้วchmod +x a.outจะเพียงพอ
Eliah Kagan

คำตอบ:


33

./เนื่องจากคุณกำลังใช้ปฏิบัติการในไดเรกทอรีการทำงานปัจจุบันคุณควรคำนำหน้ามันด้วย ./a.outดังนั้นสำหรับโปรแกรมของคุณทำงานเป็น

คำอธิบาย

เทอร์มินัลค้นหาไฟล์ที่เรียกทำงาน$PATHได้ นี่คือระบบปฏิบัติการยูนิกซ์ตัวแปรสภาพแวดล้อมที่แสดงรายการไดเรกทอรีที่มีไบนารีของระบบ (เช่นls, echoหรือgcc) หากคุณเรียกใช้ไฟล์ปฏิบัติการที่ไม่ได้อยู่ใน$PATHไดเรกทอรี (เช่นa.out) คุณต้องระบุพา ธ สัมบูรณ์ในระบบไฟล์

ใน terminal เป็นคำพ้องสำหรับไดเรกทอรีการทำงานปัจจุบันจึง. ./a.outคุณอาจจะดีพอ ๆ /home/yihang/Documents/a.outกันเรียก


1
หากต้องการอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้คำสั่ง "./" จะทำหน้าที่เป็นคำสั่ง "ได้ที่นี่" มันซ้ำซ้อนเล็กน้อย แต่มีประโยชน์ในแง่ที่คุณรู้ว่าคุณกำลังจะดำเนินการบางอย่าง
Ruben Bakker

1
คุณอาจต้องchmod u+x a.outอนุญาตให้ระบบดำเนินการ
charlesbridge

ตอนนี้ฉันได้รับด้วย "./" โปรแกรมทำงานได้ดีโดยไม่ต้อง chmod ขอบคุณ
yihangho

1
@yihang: โปรดพิจารณาทำเครื่องหมายคำถามนี้เป็นคำตอบโดยคลิกวงกลมสีเทา / สีเขียวที่ด้านซ้ายของคำตอบที่คุณชอบมากที่สุด
RafałCieślak

@ Ruben Bakker: จริงๆแล้วมันไม่ได้ซ้ำซ้อนเลย ซึ่งแตกต่างจาก Windows, Linux ไม่ได้เริ่มต้นที่จะค้นหาในไดเรกทอรีปัจจุบันหรือเริ่มต้น ดังนั้นถ้ามันไม่ได้อยู่ในเส้นทางคุณต้องระบุไดเรกทอรีไม่ว่ามันจะเป็นอะไร
Marty ผัด

9

เมื่อคุณเรียกใช้คำสั่งบน Linux จะค้นหาไดเรกทอรีทั้งหมดที่ระบุไว้ในPATHตัวแปรสภาพแวดล้อมและหากไม่พบคำสั่งที่นั่นคุณจะได้รับข้อความที่คุณเห็น

โดยทั่วไปแล้วจะมีลักษณะดังนี้:

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

/usr/local/binนั่นหมายความว่ามันจะมีลักษณะเป็นครั้งแรกใน หากไม่พบที่นั่นจะมีการตรวจสอบ/usr/binและอื่น ๆ

ในความเป็นจริงมันคล้ายกันมากใน DOS / Windows: มีตัวแปรที่เรียก%PATH%ว่าทำสิ่งเดียวกัน

ข้อแตกต่างคือในไดเรกทอรี Windows ปัจจุบันจะถูกค้นหาด้วย Unix เห็นว่าสิ่งนี้ไม่ดีเพราะไฟล์ในเครื่อง (เช่นมัลแวร์) สามารถแทนที่โปรแกรมระบบที่สำคัญโดยไม่ตั้งใจได้

หากคุณต้องการสิ่งนี้คุณสามารถทำให้ Linux ทำงานในลักษณะเดียวกันได้โดยการเพิ่ม.เส้นทาง:

PATH=.:$PATH

(นั่นบอกว่าPATHจะ.:รวมเนื้อหาที่มีอยู่ของ$PATH)

มันดูเหมือนว่าจะเป็นแบบนี้ (มันอาจจะแตกต่างกับเครื่องของคุณ)

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

หากคุณไม่ต้องการทำเช่นนั้นคุณสามารถเรียกใช้แต่ละโปรแกรมได้โดยระบุไดเรกทอรีอย่างชัดเจน:

./myprog

หรือ

/home/username/myprog

2
หากคุณไม่เพิ่ม.ไปPATH, เสมอเพิ่มล่าสุด
muru

3

โดยพื้นฐานแล้ว a.out จะถูกสร้างขึ้นตามค่าเริ่มต้นเพราะคุณไม่ได้ระบุชื่อสำหรับการปฏิบัติการ ลองใช้สิ่งนี้แทน:

gcc HelloWorld.c -o HelloWorld

เมื่อคุณทำเช่นนั้นคุณควรจะสามารถเรียกใช้โดย (ตามคำแนะนำของ Sunil) นำหน้า "HelloWorld" ด้วย dot-slash (./):

./HelloWorld

นี่คือการเชื่อมโยงไปยังบทความที่อธิบายนิด ๆ หน่อย ๆ เกี่ยวกับสาเหตุที่ a.out ที่ได้รับการสร้าง: การเขียนและการรวบรวมโปรแกรม C บน Linux

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.