Unix ค้นหาไฟล์ที่ปฏิบัติการได้อย่างไร


46

เมื่อเรียกใช้งานไฟล์ Unix จะค้นหาได้อย่างไร? หากมีไฟล์ปฏิบัติการหลายไฟล์ใน PATH ที่มีชื่อเหมือนกันไฟล์ไหนที่ต้องการ? ไดเรกทอรีปัจจุบันรวมอยู่ในการค้นหาเมื่อเรียกใช้ไฟล์หรือไม่?

สมมติว่ามีไฟล์ที่มีชื่อexecutable.shในไดเรกทอรีปัจจุบัน มันจะทำงานได้ไหมถ้ามันถูกประหาร$ executedและ.ไม่ได้เป็นส่วนหนึ่งของPATH?


การกล่าวถึงwhich <executable>คำสั่งจะมีประโยชน์ในชุดข้อความนี้
นักบัญชี

คำตอบ:


44

$ PATH ถูกค้นหาตั้งแต่ต้นจนจบโดยมีการเรียกใช้งานการจับคู่ครั้งแรก ดังนั้นไดเรกทอรีที่จุดเริ่มต้นของ $ PATH จะมีความสำคัญมากกว่าไดเรกทอรีที่มาในภายหลัง Executables ในไดเรกทอรีปัจจุบัน (.) จะถูกดำเนินการเฉพาะในกรณีที่ อยู่ใน $ PATH (ซึ่งมักจะไม่ใช่ ) ไม่มีการรวมไดเรกทอรีปัจจุบันโดยนัยในเส้นทางการค้นหา


มันแปลกที่ $ PATH ของฉันไม่ได้มี.แต่ดูเหมือนว่าจะค้นหาจาก dir ปัจจุบันก่อนที่จะตรวจสอบ dirs ที่กำหนดไว้ใน $ PATH เอง
Eric Wang

19

สำหรับไฟล์ในไดเรกทอรีปัจจุบันคุณจะต้องการที่จะนำพวกเขาด้วยดังนั้นคำสั่งก็จะกลายเป็น./ ./executable.shคุณไม่ควรมี.เส้นทางของคุณเพราะมันมีความเสี่ยงด้านความปลอดภัยท่ามกลางปัญหาอื่น ๆ

ไดเรกทอรีที่มาก่อนในเส้นทางและค้นหาก่อน

สั่งซื้อโดยรวมเพื่อการค้นหาเป็นเช่นนี้ถ้าผมจำไม่ผิด:

  • นามแฝง

  • ฟังก์ชั่นที่ส่งออก

  • คำสั่งเชลล์ในตัว

  • สคริปต์และไบนารีใน PATH ของคุณ


7
ฉันจะเพิ่มแฮ - จำทุบตี (และเปลือกหอยอื่น ๆ ) เก็บแฮคำสั่งที่ใช้ล่าสุดเพื่อให้ค้นหาได้ง่ายขึ้น บางครั้งคุณต้องล้างแคช (โดยใช้hash -r) หากคุณเปลี่ยน PATH หรือตำแหน่งของโปรแกรม
Rich Homolka

3
+1 สำหรับลำดับการค้นหา จะดีถ้าคุณจำแหล่งที่มาของข้อมูลได้ :)
twan163

8

แม้ว่าบางคนจะได้รับคำตอบที่ดี แต่ฉันต้องการเพิ่มความคิด:

1) PATH จะได้รับการพิจารณาก็ต่อเมื่อการเรียกใช้งานที่เรียกใช้นั้นไม่มีองค์ประกอบของพา ธ somecommand จะถูกค้นหาใน $ PATH ./somecommandหรือ/usr/bin/somecommandหรือ../../bin/somecommandเพียงแค่ใช้กฎของไดเรกทอรีไม่ใช่ PATH

หากมีไฟล์ปฏิบัติการหลายไฟล์ใน PATH ที่มีชื่อเดียวกันกับไฟล์ที่ต้องการ?

มันหยุดที่แรกที่พบอ่าน $ PATH จากซ้ายไปขวา

ไดเรกทอรีปัจจุบันรวมอยู่ในการค้นหาเมื่อมีการเรียกใช้ไฟล์หรือไม่

หากไดเรกทอรีปัจจุบันอยู่ในเส้นทางจากนั้นจะถูกค้นหา โปรดจำไว้ว่าไดเรกทอรีว่างใน PATH รวมถึงไดเรกทอรีปัจจุบัน เช่น PATH =: / usr / bin (นำหน้าว่าง) PATH = / usr / bin: (ต่อท้ายว่างเปล่า) และ PATH = / usr / bin :: / bin (ว่างตรงกลาง) ทั้งหมดจะรวมไดเรกทอรีทำงานปัจจุบันอย่างมีประสิทธิภาพ

สมมติว่ามีไฟล์ที่มีชื่อ executable.sh ในไดเรกทอรีปัจจุบัน จะใช้งานได้หรือไม่หากมีการดำเนินการ $ ไม่ได้เป็นส่วนหนึ่งของ PATH?

มันจะไม่พบมันด้วยการค้นหา PATH หาก dir ปัจจุบันไม่ได้อยู่ใน PATH จะไม่สามารถค้นหาได้ด้วยการค้นหา PATH

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


ขอบคุณสำหรับcacheข้อความนี้มันทำให้ฉันเกือบคลั่งไปแล้วที่การปฏิบัติการแบบเก่า/usr/bin/นั้นยังคงถูกเรียกใช้ไม่ใช่ตัวใหม่/usr/local/binแต่มันก็อยู่ทางด้านซ้ายมือ$PATHจนกระทั่งฉันออกจากระบบและเข้าสู่ระบบอีกครั้ง
นักบัญชี

1
@Theaccountant ใน bash คุณสามารถ 'hash -r' เพื่อล้างแคชของเชลล์
Rich Homolka

4

หากต้องการดูว่าเส้นทางของคุณอยู่ในขณะนี้เพียงแค่พิมพ์หรือecho $PATHprintenv PATH

แล้วคุณจะรู้ลำดับของการค้นหา หากคุณมีหลายไฟล์ที่มีชื่อเดียวกันให้เรียกใช้ ____ เพื่อดู

อดีต

system #> grep ใด

/ usr / bin / grep

วิธีที่ยอดเยี่ยมในการค้นหาไฟล์ที่ใช้งานได้ตามเป้าหมายของคุณคือใช้ apropos:

apropos grep

bzgrep (1) - ค้นหาไฟล์บีบอัด bzip2 สำหรับนิพจน์ทั่วไป

egrep (1) - พิมพ์บรรทัดที่ตรงกับรูปแบบ

fgrep (1) - พิมพ์บรรทัดที่ตรงกับรูปแบบ

grep (1) - พิมพ์บรรทัดที่ตรงกับรูปแบบ

และอื่น ๆ ...


2
โอ้ใช่ - ฉันลืมฟังก์ชันwhereisเพื่อค้นหาอินสแตนซ์ทั้งหมดของไฟล์:> whereis grep
mbb

grep: / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereisใช้รายการ hardcoded $PATHสถานที่ไม่ได้
grawity

@grawity คุณสามารถขยายความในนั้นได้หรือไม่?
WinEunuuchs2Unix

-2

@ coneslayer- ลำดับเริ่มต้นของการค้นหาไฟล์เรียกทำงานคือพา ธ ปัจจุบันสร้างขึ้นในคำสั่งแล้วตามด้วย $ PATH ดังนั้นหากฟังก์ชั่นที่ชื่อ executable มีอยู่แล้วใน pwd ดังนั้นนั่นจะถูก execute ถ้าไม่ได้ลำดับความสำคัญก็จะค้นหาคำสั่งของเชลล์แล้ว $ PATH


หากคุณกำลังพูดถึง Thompson shell, Mashey shell หรือการครอบครองซากดึกดำบรรพ์อื่น ๆ เมื่อ 40 ปีก่อนคุณอาจพูดถูก แต่ไม่มีเชลล์ Unix ปัจจุบันที่สำคัญค้นหาไดเรกทอรีปัจจุบันโดยอัตโนมัติ
สกอตต์

@Scott ดังนั้นพา ธ การค้นหาเริ่มต้นของคำสั่งจะถูกสร้างขึ้นก่อนแล้ว $ PATH และค้นหา CWD เฉพาะเมื่อฉันให้. /? ฉันถูกไหม?
proc

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