आपका प्रश्न बारीकी से संबंधित है कि आप कमांड लाइन पर पर्स उपयोगकर्ता इनपुट का उपयोग कैसे कर रहे हैं।
यदि कमांड लाइन पर पहला शब्द एक प्रोग्राम है, जो एक विशेष फ़ोल्डर में स्थित है (ज्यादातर द्वारा परिभाषित किया गया है PATH
) और कोई और विशेष वर्ण नहीं दिए गए हैं (आपके द्वारा उपयोग किए जा रहे शेल पर निर्भर करता है), रिक्त स्थान या टैब द्वारा अलग किए गए सभी बाद वाले शब्दों को पास कर दिया जाता है एक विशेष रूप में कार्यक्रम अर्थात् एक सरणी। सरणी में एक तत्व के रूप में प्रत्येक शब्द के साथ।
कैसे कार्यक्रम, आप को आमंत्रित करने जा रहे हैं तर्कों की व्याख्या (सरणी में स्थित) यह कैसे प्रोग्राम है पर निर्भर करता है। तर्क के वाक्यविन्यास कैसे दिखना चाहिए, इसके कुछ अर्ध मानक हैं, लेकिन सामान्य तौर पर प्रोग्रामर संपूर्ण स्वतंत्र है। तो पहले तर्क को एक फ़ाइल के नाम के रूप में व्याख्या की जा सकती है या उस समय के प्रोग्रामर विचार जो भी उन्होंने कार्यक्रम लिखा था।
मामले में आप विशेष चरित्र <
या >
अपनी कमांड लाइन में जोड़ते हैं , शेल ने अपॉइंटमेंट नहीं किया है <
और >
न ही बाद के शब्दों को उस सरणी में रखा जाएगा जिसे प्रोग्राम में पास किया जाएगा। साथ <
या >
दिए गए मेकअप फैंसी चीजों को खोल शुरू होता है, अंतर्निहित गिरी (कीवर्ड द्वारा समर्थित पाइपिंग )। समझ क्या आप हो रहा है समझना चाहिए क्या STDIN
और STDOUT
(क्योंकि यह तुरंत संबंधित नहीं है मैं छोड़ STDERR
) कर रहे हैं।
आपके टर्मिनल पर दिखाई देने वाली हर चीज (ज्यादातर मामलों में आपके डिस्प्ले का एक हिस्सा) या तो शेल या किसी अन्य प्रोग्राम के द्वारा लिखी जाती है, जिसे आपने पहले एक विशेष फाइल में आमंत्रित किया है ( यूनिक्स में सब कुछ एक फाइल है )। इस फ़ाइल में एक विशेष आईडी है और इसे कहा जाता है STDOUT
। यदि कोई प्रोग्राम कीबोर्ड से डेटा पढ़ना चाहता है, तो यह कीबोर्ड को सीधे (कम से कम ज्यादातर मामलों में) प्रदूषित नहीं करता है, लेकिन एक विशेष फ़ाइल जिसे रीड कहा जाता है STDIN
। आंतरिक रूप से यह फ़ाइल आपके मानक इनपुट डिवाइस, आपके कीबोर्ड से जुड़ी होती है।
यदि शेल पढ़ता है <
या >
एक पार्स कमांड कमांड में है, तो यह उसी समय के लिए हेरफेर करता है STDIN
या STDOUT
किसी विशेष प्रकार में होता है जब संबंधित प्रोग्राम चल रहा होता है। STDIN
और STDOUT
टर्मिनल या मानक इनपुट डिवाइस को किसी भी लंबे समय तक नहीं बल्कि कमांड लाइन पर उसके बाद के फ़ाइलनाम को इंगित करें।
दो लाइनों के मामले में
cat file_name
cat < file_name
मनाया व्यवहार समान है क्योंकि संबंधित डेवलपर cat
या तो डेटा को STDIN
पढ़ने या फ़ाइल से डेटा पढ़ने के लिए बनाता है , जिसका नाम पहली कमांड लाइन तर्क के रूप में दिया गया है (जो कि शेल में पहला तत्व है जो शेल पास होता है cat
)। इसके बाद टर्मिनल के लिए या cat
की पूरी सामग्री लिखता है क्योंकि हम शेल को हेरफेर करने का निर्देश नहीं देते हैं । याद रखें कि दूसरी पंक्ति में आपका शेल इस तरह से हेरफेर करता है, कि यह आपके मानक इनपुट डिवाइस को किसी भी तरह इंगित नहीं करता है, लेकिन आपके वर्तमान कार्यशील निर्देशिका में कॉल की गई फ़ाइल की ओर इशारा करता है ।file_name
STDIN
STDOUT
STDIN
file_name
रेखा के अन्य मामले में
man < file_name
man
STDIN
अगर यह बिना किसी तर्क के साथ कहा जाता है तो कुछ भी पढ़ने के लिए नहीं है, यानी एक खाली सरणी। तो रेखा
man < file_name
बराबरी
man
उदाहरण के लिए man
से कुछ पढ़ा होगा STDIN
, भी अगर तुम पारित -l -
करने के लिए man
। कमांड लाइन पर दिए गए इस विकल्प से आप अपने टर्मिनल पर man
पढ़ी गई किसी भी सामग्री को प्रदर्शित कर सकते हैं STDIN
। इसलिए
man -l - < file_name
यह भी काम करेगा (लेकिन सावधान रहना man
न केवल एक पेजर है, बल्कि फ़ाइल के इनपुट को भी पार्स करता है और इसलिए फ़ाइल सामग्री और प्रदर्शित सामग्री भिन्न हो सकती है)।
तो कैसे STDIN
, STDOUT
और कमांड लाइन तर्क की व्याख्या की जाती है, यह सभी संबंधित डेवलपर तक है।
मुझे उम्मीद है कि मेरा जवाब स्पष्ट बातें कर सकता है।
man -l - < file_name
बनाने के लिए उपयोग का उल्लेख किया है, लेकिन यह मेरे सिस्टम में विफल रहता है :man
STDIN
STDERR
man -l - < tee man: invalid option -- l man, version 1.6c