ความแตกต่างระหว่างสิ่งที่และที่ไหน


16

ความแตกต่างระหว่างคำสั่งwhereและwhichคำสั่งเชลล์คืออะไร? นี่คือตัวอย่างบางส่วน

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

และ

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

ด้วย

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

สำหรับฉันดูเหมือนว่าพวกเขาทำสิ่งเดียวกันกับที่เป็นเชลล์ในตัว แต่ไม่แน่ใจว่าแตกต่างจากคำสั่งอย่างไร

คำตอบ:


11

zshเป็นหนึ่งในไม่กี่ shells (อีกอันคือtcsh( whichมีต้นกำเนิดมาจากcshสคริปต์สำหรับcshผู้ใช้ซึ่งมีข้อ จำกัดtcshทำให้ builtin เป็นการปรับปรุง)) ซึ่งwhichทำสิ่งที่สมเหตุสมผลเนื่องจากเป็น shell builtin แต่อย่างใดคุณหรือ OS ของคุณ (ผ่านrcไฟล์บางไฟล์) ทำให้มันแตกโดยแทนที่ด้วยการเรียกไปยังwhichคำสั่งของระบบซึ่งไม่สามารถทำสิ่งที่สมเหตุสมผลได้เพราะมันไม่มีสิทธิ์เข้าถึงเชลล์ของเชลล์ดังนั้นจึงไม่รู้ว่าเชลล์นั้นตีความชื่อคำสั่งอย่างไร .

ใน zsh ทั้งหมดwhich, type, whenceและwhereมีในตัวคำสั่งที่ใช้ทั้งหมดเพื่อหาข้อมูลเกี่ยวกับสิ่งที่คำสั่งมี แต่ที่มีผลที่แตกต่างกัน พวกมันอยู่ที่นั่นด้วยเหตุผลทางประวัติศาสตร์คุณสามารถรับพฤติกรรมทั้งหมดของพวกเขาด้วยการตั้งค่าสถานะต่าง ๆ ให้กับwhenceคำสั่ง

คุณสามารถรับรายละเอียดของสิ่งที่แต่ละคนทำโดยเรียกใช้:

info -f zsh --index-search=which

หรือพิมพ์info zshจากนั้นนำดัชนีขึ้นมาiและป้อนชื่อ builtin (มีให้แล้วเสร็จ)

/usr/bin/whichและหลีกเลี่ยงการใช้ มีเปลือกในปัจจุบันที่ไม่ได้ว่า whichเป็นสิ่งจำเป็น ตามที่ Timothy พูดให้ใช้ builtin ที่เชลล์ของคุณมีให้ POSIX เชลล์ส่วนใหญ่จะมีtypeคำสั่งและคุณสามารถใช้command -vเพื่อรับพา ธ ของคำสั่งเท่านั้น (ทั้งคู่typeและcommand -vเป็นทางเลือกใน POSIX (แต่ไม่ใช่ Unix และไม่ได้อยู่ใน LSB อีกต่อไป) พวกมันจะมีให้ใช้มากที่สุดหากไม่ใช่ กระสุนคล้ายบอร์นที่คุณน่าจะเจอ)

(BTW ดูเหมือนว่า/usr/binจะปรากฏขึ้นสองครั้งในของ$PATHคุณคุณสามารถเพิ่มtypeset -U pathไปยังของคุณ~/.zshrc)


2
สิ่งนี้เกิดขึ้นในคำถามก่อนหน้านี้เช่นกัน ในการขยายจุดนี้คุณควรใช้คำสั่ง shell ที่มีอยู่แล้ว ดังนั้นในทุบตีใช้ "พิมพ์" แทน "ซึ่ง"
ทิม B

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