'cat' เป็นเชลล์ในตัวหรือเป็นโปรแกรมภายนอกหรือไม่


33

เมื่อฉันใช้typeคำสั่งเพื่อตรวจสอบว่าcatเป็นเชลล์ในตัวหรือโปรแกรมภายนอกฉันได้รับผลลัพธ์ด้านล่าง:

-$ type cat
cat is hashed (/bin/cat)
-$

นี่หมายความว่าcatเป็นโปรแกรมภายนอก/bin/catหรือไม่

ฉันสับสนเพราะเมื่อฉันตรวจสอบผลลัพธ์ด้านล่างechoเพื่อดูว่ามันเป็นbuilt-inโปรแกรม/bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

ดังนั้นฉันไม่สามารถใช้ตรรกะที่/bin/catจำเป็นต้องหมายถึงโปรแกรมภายนอกเพราะเสียงก้องเป็น/bin/echoแต่ยังคงเป็นในตัว

แล้วฉันจะรู้ได้อย่างไรว่าcatมันคืออะไร? ในตัวหรือภายนอก?


1
- คำสั่ง cat เป็นโปรแกรมภายนอกที่ทำให้เป็นส่วนหนึ่งของระบบตามสาเหตุของการกระทำหลายอย่างที่มันสามารถทำได้ไม่ใช่แบบในตัว
โจ๊กซีเนียร์ตกลง

12
type whichสามารถให้คำตอบกับคุณได้ทำไมwhichไม่ให้คำตอบกับคุณ
Dubu

1
ขึ้นอยู่กับเชลล์ที่คุณใช้
nsn

6
สนุกจริง: ทั้งสองcatและls/ ถูกเขียนโดย Stallman ตัวเอง คุณจะประหลาดใจกับสิ่งที่เขาเขียน อย่าลืมว่าเขาเขียนคอมไพเลอร์เวอร์ชั่นแรกในวันนี้ซึ่งเป็นคอมไพเลอร์ที่ดีที่สุดในโลกที่คอมไพล์ทุก ๆ อย่างและแกนกลางส่วนใหญ่ เพียงแค่พูดว่า
อเล็กซ์น้า

2
@AlecTeal คุณรู้หรือไม่ว่าระบบ Unix ส่วนใหญ่ใช้ ls และ cat ที่มีมานานกว่ารุ่น GNU ที่ Richard Stallman มีอยู่ก่อนแล้วใช่ไหม?
Ross Ridge

คำตอบ:


59

typeบอกคุณว่าเชลล์จะใช้อะไร ตัวอย่างเช่น:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

นั่นหมายความว่าหากคุณพิมพ์ bash prompt echoคุณจะได้รับบิลท์อิน หากคุณระบุพา ธ เช่นเดียวกับใน/bin/echoคุณจะได้รับคำสั่งจากภายนอก

whichโดยทางตรงข้ามเป็นโปรแกรมภายนอกที่ไม่มีความรู้พิเศษว่าเชลล์จะทำอะไร บนระบบที่มีลักษณะคล้ายเดเบียนwhichคือเชลล์สคริปต์ซึ่งค้นหา PATH สำหรับไฟล์เรียกทำงาน ดังนั้นมันจะให้ชื่อของปฏิบัติการภายนอกแม้ว่าเชลล์จะใช้ในตัว

หากคำสั่งนั้นมีอยู่ในตัวเท่านั้นwhichจะไม่ส่งคืนสิ่งใดเลย:

$ type help
help is a shell builtin
$ which help
$ 

ตอนนี้ให้ดูที่cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat เป็นไฟล์ปฏิบัติการภายนอกไม่ใช่เชลล์ในตัว


5
คุณสามารถtype -all echoหาคำสั่ง (ตามลำดับ) ซึ่งเป็น "echo" ที่แตกต่างที่รู้จักกันในเชลล์ (อันแรกเป็นที่หนึ่งที่เชลล์จะเรียกถ้าคุณไม่ได้ระบุบางสิ่งที่จะเปลี่ยนลำดับเช่นการเรียกใช้"echo"หรือ\echoหรือcommand echo)
Olivier Dulac

คำตอบที่ดี. การเพิ่มหนึ่งครั้ง: มีechoเหตุผลสองประการสำหรับเหตุผลทางประวัติศาสตร์ มันเริ่มต้นจากคำสั่งภายนอกจากนั้นถูกเพิ่มเข้ามาในตัว เชลล์เป้าหมายรุ่นก่อนหน้า ( /bin/sh) ไม่มีอยู่ /bin/echoถูกเก็บไว้เพื่อความเข้ากันได้เนื่องจากทุกสิ่งขึ้นอยู่กับมัน (สิ่งเดียวกันเกิดขึ้นกับtest.)
alexis

หมายเหตุด้านข้าง: whichตัวเองสามารถเป็นเชลล์ในตัว cmd ตัวอย่างเช่นใน tcsh:which which which: shell built-in command.
Dan Cornilescu

ฉันมาถึงปาร์ตี้ช้า แต่ทำไมคุณไม่ตรวจสอบหน้าคนและคุณสามารถเห็นจำนวนระหว่างวงเล็บซึ่งระบุว่ามันเป็นกระสุนในตัวหรืออะไรก็ตาม
poz2k4444

46

cat is hashed (/bin/cat)เป็นเหมือนcat is /bin/cat(นั่นคือมันเป็นโปรแกรมภายนอก )

ข้อแตกต่างก็คือคุณรันcatในเซสชันนี้แล้วดังนั้นทุบตีจึงค้นหา$PATHและเก็บตำแหน่งที่เกิดขึ้นในตารางแฮชแล้วดังนั้นจึงไม่ต้องค้นหาอีกในเซสชันนี้

หากต้องการดูคำสั่งทั้งหมดที่ถูกแฮชในเซสชันของคุณให้เรียกใช้ hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
ที่จริงในความคิดของฉันนี้เป็นคำตอบเดียวที่อยู่คำถามของคุณ :)
André Chalella

IMHO นี่ ^^^ จริง คำตอบนี้ควรเป็นคำตอบที่ยอมรับได้
LinuxSecurityFreak

4

อีกวิธีในการตรวจสอบรายชื่อเชลล์บิวด์อิน: การใช้compgenเชลล์บิวด์อินเอง!

คำสั่งต่อไปนี้แสดงรายการคำสั่ง shell builtin ทั้งหมด:

compgen -b

คุณสามารถตรวจสอบcat, echoโดย greping ที่ชอบ: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

ท่านสามารถเข้าดูcompgen -b | grep catผลตอบแทนกับการส่งออกไม่มีหมายถึงcatไม่ได้เป็นเปลือก builtin

เยี่ยมชมcompgenรายการของตัวเลือกที่มีประโยชน์ให้บริการโดย


คุณยังสามารถใช้คำสั่ง buildin อีกคำสั่งหนึ่งhelpเพื่อแสดง shell-builtin

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

ฉันไม่พบเอกสารที่เป็นทางการสำหรับตัวเลือกเหล่านี้คุณรู้หรือไม่ว่ามีอยู่ที่ไหน
Random832

@ Random832 คุณกำลังพูดถึงตัวเลือกcompgenใช่ไหม?
Pandya

ใช่ฉันไม่พบอะไรเลยใน manpage ของ Bash เกี่ยวกับตัวเลือกอื่น ๆ ที่มีค่า -b หรือครึ่งหนึ่ง พบได้ในภายหลังที่gnu.org/software/bash/manual/html_node/ …
สุ่ม 832

@ Random832 ลองman bash | grep -e '-A action$' -A 32คุณอาจได้รับผลเช่นนี้ (เพิ่ม / ลดดิ-Aจิตหลังจากจัดการอย่างถูกต้อง)
Pandya

4

นอกจากนี้คุณยังสามารถใช้คำสั่งwhereisที่มีประสิทธิภาพมากขึ้นเพราะมันแสดงให้เห็นว่าคำสั่งที่อยู่ในเครื่องเช่นห้องสมุดหน้าคู่มือ ฯลฯ


- ยกตัวอย่างภาษาอังกฤษที่ไม่ดีของฉันเพราะฉันเพิ่งเรียนรู้และใช้งานไม่ค่อยดี! ...
โจ๊กซีเนียร์ตกลง

2

คนอื่น ๆ ได้ตอบแล้วเกี่ยวกับฉันจะเช่นเดียวกับที่จะอธิบายปัญหากับcat echoหากคุณใช้-aตัวเลือกชนิด(แสดงรายการที่ตรงกันทั้งหมด) คุณจะเห็นว่าechoเป็นทั้งเชลล์บิลด์อินและโปรแกรมภายนอก:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

ทั้งสองเป็นอิสระจากกันอย่างสมบูรณ์ typeไม่มีตัวเลือกใดที่จะคืนค่าคำสั่งแรกที่ตรงกันที่พบ ดังนั้นประเภทจะแสดงสิ่งที่จะดำเนินการถ้าคุณทำงานfoo fooอาจจะมีตัวเลือกอื่น ๆ -aแต่ผู้ที่จะไม่แสดงเว้นแต่คุณจะใช้


2

เนื่องจากมีหลายคำตอบที่ดีเกี่ยวกับการใช้ประเภทเพื่อค้นหาว่าคำสั่งเช่นcatbuiltin หรือโปรแกรมภายนอก ฉันจะใช้แนวทางทั่วไปมากขึ้น มีบางคำสั่งที่จะต้องสร้างขึ้นภายในเพราะจะมีผลกับเชลล์ปัจจุบัน สามตัวอย่างคลาสสิกcd, เป็นโปรแกรมตัวอย่างที่ดีของชั้นนี้ที่มีเปลือกหอยที่มีเป็น builtin และเปลือกหอยที่ทำไม่ได้ เป็นที่น่าสังเกตว่าคำสั่งจำนวนมากของคลาสนี้ที่มีอยู่เป็น builtins นั้นยังมีให้ใช้งานเป็นโปรแกรมภายนอกexecexitและ มีคำสั่งบางอย่างที่ต้องไม่สร้างขึ้นเนื่องจากฟังก์ชันการทำงานของมันขึ้นอยู่กับลักษณะการทำงานของการเรียกใช้ execve หรือระบบ ตัวอย่างของโปรแกรมดังกล่าวรวมถึงsu, sudo, และcalife superคำสั่งอื่น ๆ ทั้งหมดสามารถสร้างเป็น builtins หรือโปรแกรมภายนอกcat

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