เหตุใดเราใช้“ ./” เพื่อเรียกใช้ไฟล์


84

ทำไมเราใช้./filenameเพื่อรันไฟล์ใน linux

ทำไมไม่เพียงแค่ใส่มันเหมือนคำสั่งอื่น ๆgcc, lsฯลฯ ...


บรรทัดแรกจะไม่ดีกว่าเขียนเป็น "ทำไมเราใช้./command_nameเพื่อรันคำสั่งใน linux?"

คำตอบ:


78

ใน Linux, UNIX และระบบปฏิบัติการที่เกี่ยวข้อง.แสดงถึงไดเรกทอรีปัจจุบัน เนื่องจากคุณต้องการเรียกใช้ไฟล์ในไดเรกทอรีปัจจุบันของคุณและไดเรกทอรีนั้นไม่ได้อยู่ในคุณ$PATHคุณจำเป็นต้องมี./บิตเพื่อบอกเชลล์ว่าไฟล์ปฏิบัติการอยู่ที่ไหน ดังนั้น./fooหมายถึงเรียกใช้ปฏิบัติการที่เรียกว่าfooที่อยู่ในไดเรกทอรีนี้

คุณสามารถใช้typeหรือwhichเพื่อให้ได้เส้นทางที่เต็มรูปแบบของคำสั่งใด ๆ $PATHที่พบในของคุณ


5
เป็นเรื่องปกติมากที่จะเรียกใช้งานโปรแกรมในไดเรกทอรีปัจจุบัน เหตุใดเชลล์จึงไม่ค้นหาในนั้นด้วย มันค้นหาครั้งแรกในจากนั้นใน $ PATH
Michael

นอกจากนี้ยังมีaliasES $PATHที่สามารถได้รับในทางที่ไม่เพียง
user2485710

18
@Michael security and sanity: หากค้นหา.ก่อนมันจะเป็นปัญหาด้านความปลอดภัยคุณหรือคนอื่นสามารถแทนที่ได้ls(ไวรัส / โทรจันแบบง่าย: สร้างไฟล์ zip โดยมีชื่อไฟล์เรียกทำงานlsในขณะที่บางคนกำลังค้นหาผ่าน พวกเขาเรียกใช้ไฟล์ปฏิบัติการนี้ว่า…) หากค้นหา.ครั้งสุดท้ายคุณสามารถใช้เวลานานมากที่จะไม่รู้ว่าทำไมโปรแกรมของคุณถึงไม่ทำงาน (เช่นคุณสร้างโปรแกรมที่เรียกว่าการทดสอบแทนการรันโปรแกรมของคุณมันจะรันโปรแกรมทดสอบระบบซึ่งไม่สร้างผลลัพธ์)
ctrl-alt-delor

นอกจากนี้ยังช่วยให้มั่นใจว่าหากแอปพลิเคชันหรือสคริปต์ปรากฏหลายครั้งในเส้นทางของคุณว่าคุณกำลังดำเนินการเวอร์ชันที่คุณตั้งใจจะรัน (อันเดียวในไดเรกทอรี "." ของคุณ)
Jim2B

คุณสามารถดำเนินการexport PATH="$PATH:."เพื่อรันคำสั่งในไดเรกทอรีปัจจุบันหากไม่พบที่อื่นใน PATH คุณสามารถเพิ่มสิ่งนี้ในไฟล์. bashrc ของคุณ
jcubic

99

$PATHคำตอบที่แท้จริงคือเป็นคนอื่นได้รับเพราะไดเรกทอรีปัจจุบันไม่ได้อยู่ในของคุณ

แต่ทำไม กล่าวโดยย่อก็เพื่อความปลอดภัย หากคุณกำลังมองหาโฮมไดเร็กตอรี่ของบุคคลอื่น (หรือ / tmp), และพิมพ์เพียงแค่, gccหรือlsคุณต้องการรู้ว่าคุณกำลังใช้งานจริง, ไม่ใช่เวอร์ชันที่เป็นอันตรายที่เพื่อนนักเล่นพิเรนสเตอร์ของคุณเขียนซึ่งจะลบไฟล์ทั้งหมดของคุณ อีกตัวอย่างหนึ่งคือtestหรือ[ซึ่งอาจแทนที่คำสั่งเหล่านั้นในเชลล์สคริปต์หากเชลล์ของคุณไม่มีคำสั่งเหล่านั้นในตัว

มี.เป็นครั้งสุดท้ายรายการในเส้นทางของคุณเป็นบิตที่ปลอดภัย แต่มีการโจมตีอื่น ๆ ซึ่งทำให้การใช้งานที่ หนึ่งที่ง่ายคือการใช้ประโยชน์จากความผิดพลาดที่พบบ่อยเช่นหรือsl ls-lหรือค้นหาคำสั่งทั่วไปที่ไม่ได้ติดตั้งบนระบบนี้ - vimตัวอย่างเช่นเนื่องจาก sysadmins มีแนวโน้มสูงกว่าค่าเฉลี่ยที่จะพิมพ์


5
ตัวอย่างที่ใช้งานได้จริงของบางคนได้รับโดย: unix.stackexchange.com/questions/7767
mattdm

เพียงแค่มีเส้นทางที่แน่นอนในPATHตัวแปรสภาพแวดล้อม
Ed Heal

45

หากคุณหมายความว่าทำไมคุณต้องใช้. / ตอนเริ่มต้น - นั่นเป็นเพราะ (ต่างจากใน Windows) ไดเรกทอรีปัจจุบันไม่ได้เป็นส่วนหนึ่งของเส้นทางของคุณโดยค่าเริ่มต้น หากคุณทำงาน:

$ ls

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

$ a.out

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

หากคุณถามว่าเพราะเหตุใดจึงเรียกว่า "a.out" นั่นเป็นเพียงชื่อไฟล์เอาต์พุตเริ่มต้นสำหรับ gcc คุณสามารถเปลี่ยนได้ด้วย -o บรรทัดคำสั่งหาเรื่อง ตัวอย่างเช่น:

$ gcc test.c -o test
$ ./test

ขอบคุณฉันสงสัยว่าทำไมคุณถึงต้องการ. / ตอนเริ่มต้น .... ฉันได้ใช้ "." (เพื่อ poit ไดเรกทอรีปัจจุบัน) แต่ทำไม "/" หลังจากนั้น
Renjith G

8
/ คือตัวคั่นพา ธ ใน Linux ดังนั้นคุณจึงใช้มันเพื่อแยกไดเรกทอรี (.) ออกจากชื่อไฟล์ (a.out) ก็ไม่มีคุณมี. a.out ซึ่งเป็นชื่อไฟล์ที่ถูกต้องในสิทธิของตนเอง (ลองtouch .a.out; ls -lAดูนี่สิ)
Simon Whitaker

5
ว่าเป็นวิธีที่คุณระบุเส้นทางในยูนิกซ์, <dir>/<file>เพื่อให้คุณมีพื้นบอกว่ารันไฟล์ในไดเรกทอรีปัจจุบันซึ่งจะแสดงโดย./test
Rohan Monga

Red Hat Linux รีลีส 9 (Shrike) เคอร์เนล 2.4.20-8 บน i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA รวม 3 -rw-rw-r-- 1 renjithg renjithg 0 พ.ย. 30 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 พ.ย. 30 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 สิงหาคม 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9 หรือไม่ ถึงเวลาอัพเกรดแล้ว!
mattdm

4

คุณสามารถลองเพิ่ม:.ตัวแปร $ PATH ของคุณ

ลอง ALT + F2 และพิมพ์: gksudo gedit /etc/environmentถ้าใช้ Linux / GTK (นี่คือสิ่งที่คุณมีหากใช้ Ubuntu)

อย่างไรก็ตามฉันขอแนะนำให้คุณอย่าทำเช่นนั้น มันเลวร้ายเลวร้ายเลวร้าย

คุณรู้ไหมว่ามันทำงานแบบนี้มาตั้งแต่ปี 1970 มีเหตุผลว่าทำไมไดเรกทอรีปัจจุบันไม่รวมอยู่ใน $ PATH

. เป็นไดเรกทอรีปัจจุบัน

.somethingจะเป็นไฟล์ที่ซ่อนอยู่ (พิมพ์ "ALT +" เพื่อให้ปรากฏใน Nautilus หรือลอง " ls -la"

./someProgram.sh คือสิ่งที่คุณพิมพ์เพื่อเรียกใช้ someProgram.sh ที่รันได้ในไดเร็กทอรีปัจจุบัน

.somethingElse จะหมายความว่าคุณมีไฟล์ปฏิบัติการที่ซ่อนอยู่ในไดเรกทอรีปัจจุบันซึ่งเป็นแนวคิดที่ไม่ดี

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