เชลล์ - จะค้นหาไดเร็กทอรีของคำสั่งบางคำสั่งได้อย่างไร


128

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

ฉันมาที่เปลือกและเขียน:

$ lshw

ฉันต้องการทราบคำสั่งบนเชลล์ที่สามารถบอกฉันได้ว่าคำสั่งนี้อยู่ที่ไหน กล่าวอีกนัยหนึ่งว่า "ไฟล์ปฏิบัติการ" นี้อยู่ที่ไหน?

สิ่งที่ต้องการ:

$ location lshw
/usr/bin

ใคร?

คำตอบ:


189

หากคุณใช้ Bash หรือ zsh ให้ใช้สิ่งนี้:

type -a lshw

สิ่งนี้จะแสดงว่าเป้าหมายเป็น builtin ฟังก์ชันนามแฝงหรือปฏิบัติการภายนอก หากเป็นอย่างหลังระบบจะแสดงสถานที่แต่ละแห่งที่ปรากฏในPATHไฟล์.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

ใน Bash สำหรับฟังก์ชั่นtype -aจะแสดงนิยามฟังก์ชันด้วย คุณสามารถใช้declare -f functionnameเพื่อทำสิ่งเดียวกัน (คุณต้องใช้สิ่งนั้นสำหรับ zsh เนื่องจากtype -aไม่ทำ)


ขอบคุณทุกคนที่ตอบ แต่คำตอบนี้น่าตื่นเต้นที่สุด! ขอบคุณ! ฉันคิดว่าฉันบ้าไปแล้วเพราะฉันได้กำหนดวิธีการทำสิ่งนี้ไว้ (เมื่อนานมาแล้ว): 'อัปเดต' และสิ่งนี้กำลังทำ 'apt-get update; apt-get dist-upgrade 'สำหรับฉัน แต่ตอนนี้ฉันพยายามหาไฟล์ update.sh ที่ไหนสักแห่ง แต่ไม่พบ นั่นเป็นเหตุผลที่ฉันเริ่มคำถามนี้ แต่ตอนนี้ใช้ 'type -a update' ฉันพบว่านี่เป็นเพียงนามแฝงที่กำหนดไว้ใน. bashrc ของฉันที่อยู่ใน ~ home ของฉัน ขอบคุณจริงๆ.
Gabriel L. Oliveira

1
@ Gabriel: หากคุณไม่คุ้นเคยlocateสามารถช่วยค้นหาไฟล์ได้ ใช้ฐานข้อมูลที่ดูแลโดยupdatedbเรียกใช้จากงาน cron เนื่องจากlocateค้นหาฐานข้อมูลมากกว่าระบบไฟล์ทั้งหมดจึงเร็วกว่าfind(ซึ่งสามารถใช้เป็นทางเลือกสุดท้าย)
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

ขอบคุณ. ฉันจะศึกษาเครื่องมือนี้และดูว่า updatedb ถูกกำหนดให้ทำงานบน cronjob ของ Ubuntu อย่างไร
Gabriel L. Oliveira

บางครั้งtype -aอาจสร้างความสับสนได้ เช่นในกรณีของnvmซึ่งเป็นฟังก์ชั่นที่ผมทุบตีต้องทำ: เพื่อหาสิ่งที่แน่นอนคือtype -a nvm | head -n1 nvm
Marinos

@MarinosAn: สำหรับฟังก์ชันให้type -aแสดงคำจำกัดความของฟังก์ชันเช่นเดียวกับประเภทของไฟล์ปฏิบัติการ ความเสี่ยงในการใช้headคือในกรณีของชื่อที่มีมากกว่าหนึ่งประเภทประเภทเพิ่มเติมจะไม่ถูกส่งออก type -tคุณอาจต้องการที่จะดูที่
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

66

แบบนี้:

which lshw

หากต้องการดูคำสั่งทั้งหมดที่ตรงกับเส้นทางของคุณ:

which -a lshw 

7
ซึ่ง -a lshw เพื่อดูคำสั่งทั้งหมดที่ตรงกับเส้นทางของคุณ
AlG

ฉันเชื่อว่าสิ่งนี้ใช้ได้กับคำสั่งเท่านั้น (ไฟล์ปฏิบัติการบน $ PATH) ไม่ใช่ฟังก์ชัน
Olivier Lacan

whichเป็นปัญหาเนื่องจากมีการใช้งานหลายอย่างซึ่งหลายอย่างทำสิ่งที่ไม่ถูกต้องทั้งหมดและอื่น ๆ ดูเหมือนจะทำงานได้ดี แต่มีเรื่องแปลกประหลาดใจ คุณควรจะชอบtypeแทน
tripleee

ใช้ไม่ได้กับนามแฝงและฟังก์ชันทุบตี อย่างน้อยใน Ubuntu ใช้งานได้ดีขึ้นtype -a lshw
Marinos

17

PATH เป็นตัวแปรสภาพแวดล้อมและสามารถแสดงด้วยคำสั่ง echo:

echo $PATH

มันคือรายการของเส้นทางที่คั่นด้วยอักขระโคลอน ' :'

whichคำสั่งบอกคุณที่ได้รับการดำเนินไฟล์เมื่อคุณเรียกใช้คำสั่ง:

which lshw

บางครั้งสิ่งที่คุณได้รับคือเส้นทางไปยัง symlink หากคุณต้องการติดตามลิงก์นั้นไปยังที่ที่มีการใช้งานจริงคุณสามารถใช้readlinkและป้อนผลลัพธ์ของwhich:

readlink -f $(which lshw)

-fสั่งพารามิเตอร์readlinkที่จะเก็บต่อไป symlink ซ้ำ

นี่คือตัวอย่างจากเครื่องของฉัน:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh


3

ใน TENEX C Shell, tcshเราสามารถแสดงรายการตำแหน่งของคำสั่งหรือถ้าเป็นคำสั่งในตัวโดยใช้whereคำสั่งเช่น:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd

1

อีกทางเลือกหนึ่งtype -aคือcommand -V

เนื่องจากส่วนใหญ่ฉันสนใจ แต่ผลลัพธ์แรกเท่านั้นฉันจึงไปจากส่วนหัวด้วย วิธีนี้จะไม่ทำให้หน้าจอเต็มไปด้วยรหัสในกรณีที่มีฟังก์ชันทุบตี

command -V lshw | head -n1

0

Korn เชลล์kshนำเสนอwhenceบิวท์อินซึ่งระบุเชลล์บิวต์อินมาโครและอื่น ๆ อย่างไรก็ตามwhichคำสั่งนี้พกพาสะดวกกว่า


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