क्या 'कैट' एक शेल-इन या बाहरी प्रोग्राम है?


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
-कमांड कैट एक बाहरी प्रोग्राम है जो सिस्टम का हिस्सा बनता है, प्रति क्रियाओं के कारण यह प्रदर्शन कर सकता है कि यह एक साधारण बिल्ट-इन नहीं है।
जोक सीन ओके

12
type whichआपको जवाब दे सकता है कि आप जवाब क्यों whichनहीं देंगे।
डब्यू

1
आपके द्वारा उपयोग किए जा रहे शेल पर निर्भर करता है
nsn

6
मजेदार तथ्य: स्टैलमैन द्वारा खुद लिखे गए हैं catऔर दोनों lsहैं। आपको आश्चर्य होगा कि उन्होंने कितना सामान लिखा। मत भूलो कि उन्होंने संकलक के पहले संस्करणों को लिखा था जो आज दुनिया में सबसे अच्छा संकलक है जो हर दिन और अधिकांश मुख्य बर्तनों को संकलित करता है। बस कह रहे हैं '
एलेक टील

2
@AlecTeal आपको पता है कि ज्यादातर यूनिक्स सिस्टम ls और कैट के संस्करणों का उपयोग करते हैं जो कि लंबे समय से GNU संस्करणों से पहले होते हैं जिसमें रिचर्ड स्टालमैन का हाथ था?
रॉस रिज

जवाबों:


59

typeआपको बताता है कि शेल क्या उपयोग करेगा। उदाहरण के लिए:

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

इसका मतलब है कि अगर, बैश प्रॉम्प्ट पर, आप टाइप करते हैं echo, तो आपको बिल्ट-इन मिलेगा। यदि आप पथ निर्दिष्ट करते हैं, तो जैसा कि /bin/echoआपको बाहरी कमांड मिलेगा।

which, इसके विपरीत, एक बाहरी कार्यक्रम है जिसमें कोई विशेष ज्ञान नहीं है कि शेल क्या करेगा। डेबियन जैसी प्रणालियों पर, whichएक शेल स्क्रिप्ट है जो निष्पादन के लिए पैठ की खोज करता है। इस प्रकार, यह आपको बाहरी निष्पादन योग्य का नाम देगा भले ही शेल एक अंतर्निर्मित का उपयोग करेगा।

यदि कोई कमांड केवल अंतर्निहित के रूप में उपलब्ध है, 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, या command echo)
ओलिवियर दुलक

अच्छा उत्तर। एक जोड़: echoऐतिहासिक कारणों के दो संस्करण हैं । यह एक बाहरी कमांड के रूप में शुरू हुआ, फिर बिल्ट-इन के रूप में जोड़ा गया। बॉर्न शेल ( /bin/sh) के शुरुआती संस्करणों में यह नहीं था। /bin/echoअनुकूलता के लिए रखा गया था, क्योंकि सभी प्रकार की चीजें उस पर निर्भर थीं। (इसी बात के साथ हुआ test।)
एलेक्सिस

साइड नोट: 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
वास्तव में, मेरी राय में यह एकमात्र उत्तर है जो आपके प्रश्न को संबोधित करता है :)
एंड्रे शैले

IMHO यह ^ ^ ^ ^ सत्य है। यह उत्तर स्वीकृत होना चाहिए।
LinuxSecurityFreak

4

शेल बिलिन की सूची की जांच करने का दूसरा तरीका: शेल बिलिन का उपयोग करना compgen!

निम्न कमांड सभी शेल बिल्ड कमांड को सूचीबद्ध करता है:

compgen -b

आप जाँच कर सकते हैं cat, echoजैसे:

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

आप compgen -b | grep catबिना आउटपुट के रिटर्न देख सकते हैं , इसका मतलब catशेल बिल्ट नहीं है

द्वारा उपलब्ध कराए गए उपयोगी विकल्पों की सूची पर जाएंcompgen


helpशेल-बिलिन प्रदर्शित करने के लिए आप एक अन्य बिल्टइन कमांड का भी उपयोग कर सकते हैं ।

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

मुझे इन विकल्पों के लिए कोई औपचारिक दस्तावेज नहीं मिल रहा है, क्या आप जानते हैं कि यह कहां मौजूद है?
रैंडम 832

@ Random832 क्या आप विकल्पों के बारे में बात कर रहे हैं compgen?
पंड्या

हाँ, मैं बैश मैनपेज में कुछ भी नहीं खोज सका -b या आधे अन्य विकल्पों का क्या मतलब है। बाद में इसे gnu.org/software/bash/manual/html_node/…
random832

@ Random832 कोशिश करें कि man bash | grep -e '-A action$' -A 32आपको शायद इस तरह आउटपुट मिले । ( -Aठीक से प्रबंधित करने के बाद अंकों में वृद्धि / कमी )।
पंड्या

4

आप उस कमांड का भी उपयोग कर सकते हैं whereisजो अधिक कुशल है क्योंकि यह दिखाता है कि कमांड मशीन पर कहां है जैसे कि मैनुअल पेज लाइब्रेरी आदि।


-मेरे खराब अंग्रेजी के लिए मुझे बताएं, क्योंकि मैं अभी तक सीख रहा हूं और इतना अच्छा उपयोग नहीं कर रहा हूं! ...
जोक सीन ओके

2

दूसरों के बारे में पहले से ही जवाब दिया है cat, मैं इस मुद्दे के साथ समझाना चाहूंगा echo। आप प्रकार के उपयोग करते हैं -aविकल्प (सूची सभी मैचों), आप उस देखेंगे echoहै दोनों एक खोल में निर्मित और एक बाहरी कार्यक्रम:

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

दोनों एक दूसरे से पूरी तरह स्वतंत्र हैं। typeकोई विकल्प नहीं मिलने पर बस पहला मिलान आदेश वापस मिलेगा। इसलिए, टाइप करने पर fooआपको पता चलेगा कि आपके द्वारा चलाए जाने पर क्या निष्पादित होगा foo। अन्य विकल्प भी हो सकते हैं, लेकिन जब तक आप उपयोग नहीं करेंगे, तब तक वे दिखाए नहीं जाएंगे -a


2

चूंकि टाइप का उपयोग करने के बारे में यहां कई अच्छे उत्तर हैं, ताकि यह पता लगाया जा सके कि एक कमांड जैसे कि catएक बिलिन या बाहरी प्रोग्राम है। मैं अधिक सामान्य दृष्टिकोण अपनाने जा रहा हूं। कुछ कमांड्स हैं जो बिल्डिंस होनी चाहिए क्योंकि वे वर्तमान शेल को प्रभावित करती हैं। तीन क्लासिक उदाहरण हैं cd, execऔर exit। कुछ कमांड हैं जो बिलिंस नहीं होने चाहिए क्योंकि उनकी कार्यक्षमता निष्पादित या सिस्टम कॉल के व्यवहार पर निर्भर करती है। ऐसे कार्यक्रमों के उदाहरण में शामिल हैं su, sudo, califeऔर super। अन्य सभी आदेशों को बिल्डिंस या बाहरी कार्यक्रमों के रूप में बनाया जा सकता है।catइस वर्ग का एक बेहतरीन उदाहरण कार्यक्रम है क्योंकि इसमें ऐसे गोले हैं जो इसे एक बिलियन और गोले के रूप में शामिल करते हैं जो नहीं करते हैं। यह ध्यान देने योग्य है कि इस वर्ग के कई कमांड जो कि बिल्डिन के रूप में उपलब्ध हैं, बाहरी कार्यक्रमों के रूप में भी उपलब्ध हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.