ทำไมฉันต้องพิมพ์“ ./” เสมอก่อนที่โปรแกรมจะเรียกใช้งานใน Linux?


8

เมื่อฉันรวบรวม egxc โดย:

GCC x.c -o x

ในการดำเนินการผลลัพธ์ฉันต้องเขียน:

./x

และเพียงพิมพ์:

x

ล้มเหลวด้วยข้อความนี้:

x: ไม่พบคำสั่ง

หมายความว่า Linux ไม่ค้นหาไดเรกทอรีปัจจุบัน! มี (ฉันแน่ใจว่ามี) ปัญหาใด ๆ ที่เหมาะสมหลังพฤติกรรมนี้?


เพราะมันเป็นกฎ
Daniel R Hicks

@ ด่าน: จากนั้นอธิบาย "กฎ" ด้วย
Torben Gundtofte-Bruun

คำตอบ:


13

เนื่องจากโดยค่าเริ่มต้นไดเรกทอรีการทำงานปัจจุบันไม่ได้อยู่ในPATHตัวแปร

นี่คือมาตรการรักษาความปลอดภัย / ความสะดวกสบาย ถ้าคุณมีไบนารี / สคริปต์เรียกเช่นcd, lsฯลฯ ในไดเรกทอรีที่ทำงานปัจจุบันของคุณก็จะเป็นที่น่ารำคาญมากถ้าพวกเขาถูกเรียกใช้โดยค่าเริ่มต้น


4
คำตอบนั้นถูกต้องเพียงบางส่วนเท่านั้น ปัญหาอาจถูกล้อมรอบหากไดเรกทอรีปัจจุบันถูกใช้เป็นตัวเลือกสุดท้ายเท่านั้น จากนั้นจะพบเครื่องมือมาตรฐานก่อน
ผู้ใช้ที่ไม่รู้จัก

1
นอกจากนี้ builtins เปลือกใช้ precendence (เช่นเมื่อคุณพิมพ์cdในbashจะรันประจำภายในเพื่อทุบตีและไม่ได้/bin/cd) เว้นแต่คุณจะย่อหน้าด้วย `.`
LawrenceC

3
หนึ่งในมาตรการรักษาความปลอดภัย * nix ดั้งเดิมจะบังคับให้ระบบหรือไบนารีที่รวบรวมโดยผู้ดูแลระบบซึ่งอยู่ในคำสั่ง path ที่ระบบกำหนดให้ดำเนินการ ไม่มีอะไรเลวร้ายอย่างที่มีคนเข้าสู่ระบบในฐานะ root ในคำถามแผนกช่วยเหลือไปที่ไดเรกทอรีผู้ใช้พิมพ์lsและพบว่าพวกเขาโหลดระเบิดที่เหลือโดยผู้ใช้
Fiasco Labs

7
@userunknown: และครั้งแรกที่คุณพิมพ์slคุณมีปัญหาเดียวกัน ควรมีไดเรกทอรีที่เชื่อถือได้เท่านั้น$PATHและเส้นทางแบบสัมพัทธ์.จะไม่เป็นไดเรกทอรีที่เชื่อถือได้สำหรับเชลล์แบบโต้ตอบ

2
@ พื้นฐาน: ถ้าฉันพิมพ์rm -r targetเมื่อฉันหมายถึงrm -f targetมักจะไม่แตกต่างกัน ถ้าฉันพิมพ์rm -f targetเมื่อฉันหมายถึงrm -r targetอาจไม่มีความแตกต่างหรือเอาออกทันที นอกจากนี้ผมคิดว่าทุกครั้งก่อนที่ผมชนิดrm, โดยเฉพาะอย่างยิ่งถ้าฉันเพิ่ม-fหรือ-rหรือ glob - มันเป็นคำสั่งโดยธรรมชาติของมันอันตราย ไม่มีใครคิดมาก่อนlsไอเอ็นจี


1

คุณสามารถแก้ไขได้โดยเพิ่มไดเรกทอรีปัจจุบัน (แสดงด้วยจุดเดียว) ให้กับPATHตัวแปรสภาพแวดล้อม
วิธีการทำขึ้นอยู่กับเชลล์ที่คุณใช้
หากคุณกำลังใช้ bash คุณสามารถเพิ่มบรรทัด export PATH=$PATH:.ลงใน.bashrcไฟล์ในโฮมไดเร็กตอรี่ของคุณได้
หากคุณใช้ csh หรือ tcsh ให้เพิ่มบรรทัด set PATH = ($PATH .)ลงในไฟล์. cshrc ในโฮมไดเร็กตอรี่ของคุณ
IMHO สำหรับคอมพิวเตอร์เดสก์ท็อปที่บ้านสิ่งนี้เป็นสิ่งที่ยอมรับได้ - ความปลอดภัยที่ชาญฉลาด


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