มีทุบตี builtin สำหรับ 'ซึ่ง'?


16

ฉันกำลังทดสอบการติดตั้ง Fedora ขั้นต่ำ whichในการตรวจสอบเส้นทางสำหรับล่ามเช่นงูหลามหรือโหนดผมปกติใช้

ฉันสังเกตwhichว่าไม่ได้ติดตั้งตามค่าเริ่มต้น ฉันสามารถเพิ่มแพ็คเกจ แต่ฉันสงสัยว่ามี shell builtin ที่สามารถใช้เพื่อทำงานทั่วไปนี้ได้หรือไม่

ฉันใช้ทุบตี 4.2


1
ยังไงก็ตามการค้นหา Windows ที่เทียบเท่าทำให้ฉันมาที่นี่ สำหรับผู้ดูในอนาคต: "ที่ไหน" จะบอกเส้นทางของไฟล์ที่ได้รับ
เป็ดยาง

1
ฉันขอแนะนำให้ทุกคนที่เจอคำถามนี้เพื่ออ่านคำถาม & คำตอบนี้ด้วย whichมันครอบคลุมทุกสิ่งที่คุณอยากรู้เกี่ยวกับ ทำไมไม่ใช้“ อันไหน”? จะใช้อะไรดี?
slm

คำตอบ:


26

คุณสามารถใช้typeซึ่งเป็น Bash builtin:

$ type -P which
which is /usr/bin/which

สำหรับเอกสารดูhelp [t]ypeที่ซึ่งอ้างถึงtypeส่วนในbashหน้าคน

( help typeพิมพ์หน้าช่วยเหลือสำหรับสอง บิลด์ที่ขึ้นต้นด้วยสตริง "type" ซึ่งหนึ่งในนั้นล้าสมัยและไม่เกี่ยวข้องกับสิ่งนี้)


3
ฉันชอบtype -aตัวเอง ทำไมวงเล็บใน[t]ype?
เกล็นแจ็คแมน

type -aจะพิมพ์ทุกสิ่งที่อาร์กิวเมนต์ชี้ไปที่ไม่ใช่เฉพาะสิ่งที่จะถูกเรียกใช้เมื่อพิมพ์
l0b0

2
ฉันขอแนะนำให้ทุกคนที่เจอคำถามนี้เพื่ออ่านคำถาม & คำตอบนี้ด้วย whichมันครอบคลุมทุกสิ่งที่คุณอยากรู้เกี่ยวกับ ทำไมไม่ใช้“ อันไหน”? จะใช้อะไรดี?
slm

สิ่งแรกในรายการtype -aคือสิ่งที่จะดำเนินการเสมอ ฉันทำเช่นเดียวกับเกล็นและมักจะใช้type -aด้วย
slm

1
type -pไม่แสดงเส้นทางถ้าคำสั่งเป็นนามแฝง type -Pแสดงเส้นทางคำสั่งอย่างถูกต้องเสมอ ฉันคิด. เราควรอัปเดตคำตอบที่ยอมรับว่าเป็นtype -P@ l0b0
dirigeant

10

คุณสามารถใช้หรือtype command -vผลลัพธ์ของtypeการอ่านเป็นมนุษย์ เอาต์พุตของcommand -vสามารถถูกดำเนินการโดย Bash

โปรดทราบว่าพวกเขาแตกต่างกันเล็กน้อย typeและcommandค้นหาค่าแฮชของคำสั่ง กล่าวคือถ้าคุณพิมพ์cmd, type cmdหรือcommand -v cmdจะบอกคุณว่าสิ่งที่จะถูกเรียกใช้ พวกเขายังทำงานกับนามแฝงฟังก์ชั่นทุบตีและ Bash builtins (แม้ว่าtype -pจะไม่สนใจสิ่งเหล่านี้และส่งคืนไฟล์จริงเท่านั้น)

whichแค่ค้นหาบน PATH สิ่งนี้แตกต่างกันเนื่องจาก:

  • หากมีนามแฝงฟังก์ชั่นหรือ builtin ที่มีชื่อเดียวกันมันจะถูกเรียกแทน
  • หากคำสั่งถูกเพิ่มไว้ก่อนหน้าใน PATH ตั้งแต่คำสั่งแฮชครั้งสุดท้ายจะพบwhichแต่การดำเนินการคำสั่งนั้นจะใช้ค่าแฮช (คุณสามารถบังคับให้อัพเดตแฮชใน Bash ด้วยhash -r)

โดยปกติแล้วผู้คนต้องการอย่างแท้จริงtypeไม่ใช่whichอย่างน้อยสำหรับการใช้แบบอินเทอร์แอคทีฟเนื่องจากพวกเขาใช้เพื่อค้นหา "คำสั่งนี้มาจากไหนเมื่อฉันเรียกใช้งาน" คุณควรใช้เฉพาะwhichเมื่อคุณต้องการค้นหา PATH จริงๆ


command -vksh whenceเป็นเทียบเท่าของ
Henk Langeveld

1
ดังนั้นเราจึงมีwhere, whenceและแน่นอนยังwho, whyและwhen? ทำไมถึงไม่มีwhat?
Hagen von Eitzen

echo 'main(){printf("what\n");}' | sudo cc -x c - -o /usr/local/bin/what
Ivan Vučica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.