एसटीडीआईएन और तर्कों के बीच अंतर क्या है?


16

मैं catविधि को निष्पादित करने के लिए किसी भी रूप का उपयोग कर सकता हूं :

cat file_name
cat < file_name

नतीजा वही है

फिर मैं manप्रारूप में निष्पादित करना चाहता हूंstdin

man < file_name

जबकि file_nameइसमें शामिल हैं:

# file_name
cat

लेकिन यह What manual page do you want?निष्पादन के बजाय पॉप अप करता है man cat

मैं जानना चाहता हूं कि तर्क के रूप में क्यों catस्वीकार stdinकिया जा सकता है लेकिन manनहीं। और कमांड लाइन तर्क और के बीच अंतर क्या है stdin?

जवाबों:


21

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

यदि कमांड लाइन पर पहला शब्द एक प्रोग्राम है, जो एक विशेष फ़ोल्डर में स्थित है (ज्यादातर द्वारा परिभाषित किया गया है PATH) और कोई और विशेष वर्ण नहीं दिए गए हैं (आपके द्वारा उपयोग किए जा रहे शेल पर निर्भर करता है), रिक्त स्थान या टैब द्वारा अलग किए गए सभी बाद वाले शब्दों को पास कर दिया जाता है एक विशेष रूप में कार्यक्रम अर्थात् एक सरणी। सरणी में एक तत्व के रूप में प्रत्येक शब्द के साथ।

कैसे कार्यक्रम, आप को आमंत्रित करने जा रहे हैं तर्कों की व्याख्या (सरणी में स्थित) यह कैसे प्रोग्राम है पर निर्भर करता है। तर्क के वाक्यविन्यास कैसे दिखना चाहिए, इसके कुछ अर्ध मानक हैं, लेकिन सामान्य तौर पर प्रोग्रामर संपूर्ण स्वतंत्र है। तो पहले तर्क को एक फ़ाइल के नाम के रूप में व्याख्या की जा सकती है या उस समय के प्रोग्रामर विचार जो भी उन्होंने कार्यक्रम लिखा था।

मामले में आप विशेष चरित्र <या >अपनी कमांड लाइन में जोड़ते हैं , शेल ने अपॉइंटमेंट नहीं किया है <और >न ही बाद के शब्दों को उस सरणी में रखा जाएगा जिसे प्रोग्राम में पास किया जाएगा। साथ <या >दिए गए मेकअप फैंसी चीजों को खोल शुरू होता है, अंतर्निहित गिरी (कीवर्ड द्वारा समर्थित पाइपिंग )। समझ क्या आप हो रहा है समझना चाहिए क्या STDINऔर STDOUT(क्योंकि यह तुरंत संबंधित नहीं है मैं छोड़ STDERR) कर रहे हैं।

आपके टर्मिनल पर दिखाई देने वाली हर चीज (ज्यादातर मामलों में आपके डिस्प्ले का एक हिस्सा) या तो शेल या किसी अन्य प्रोग्राम के द्वारा लिखी जाती है, जिसे आपने पहले एक विशेष फाइल में आमंत्रित किया है ( यूनिक्स में सब कुछ एक फाइल है )। इस फ़ाइल में एक विशेष आईडी है और इसे कहा जाता है STDOUT। यदि कोई प्रोग्राम कीबोर्ड से डेटा पढ़ना चाहता है, तो यह कीबोर्ड को सीधे (कम से कम ज्यादातर मामलों में) प्रदूषित नहीं करता है, लेकिन एक विशेष फ़ाइल जिसे रीड कहा जाता है STDIN। आंतरिक रूप से यह फ़ाइल आपके मानक इनपुट डिवाइस, आपके कीबोर्ड से जुड़ी होती है।

यदि शेल पढ़ता है <या >एक पार्स कमांड कमांड में है, तो यह उसी समय के लिए हेरफेर करता है STDINया STDOUTकिसी विशेष प्रकार में होता है जब संबंधित प्रोग्राम चल रहा होता है। STDINऔर STDOUTटर्मिनल या मानक इनपुट डिवाइस को किसी भी लंबे समय तक नहीं बल्कि कमांड लाइन पर उसके बाद के फ़ाइलनाम को इंगित करें।

दो लाइनों के मामले में

cat file_name
cat < file_name

मनाया व्यवहार समान है क्योंकि संबंधित डेवलपर catया तो डेटा को STDINपढ़ने या फ़ाइल से डेटा पढ़ने के लिए बनाता है , जिसका नाम पहली कमांड लाइन तर्क के रूप में दिया गया है (जो कि शेल में पहला तत्व है जो शेल पास होता है cat)। इसके बाद टर्मिनल के लिए या catकी पूरी सामग्री लिखता है क्योंकि हम शेल को हेरफेर करने का निर्देश नहीं देते हैं । याद रखें कि दूसरी पंक्ति में आपका शेल इस तरह से हेरफेर करता है, कि यह आपके मानक इनपुट डिवाइस को किसी भी तरह इंगित नहीं करता है, लेकिन आपके वर्तमान कार्यशील निर्देशिका में कॉल की गई फ़ाइल की ओर इशारा करता है ।file_nameSTDINSTDOUTSTDINfile_name

रेखा के अन्य मामले में

man < file_name

manSTDINअगर यह बिना किसी तर्क के साथ कहा जाता है तो कुछ भी पढ़ने के लिए नहीं है, यानी एक खाली सरणी। तो रेखा

man < file_name

बराबरी

man

उदाहरण के लिए manसे कुछ पढ़ा होगा STDIN, भी अगर तुम पारित -l -करने के लिए man। कमांड लाइन पर दिए गए इस विकल्प से आप अपने टर्मिनल पर manपढ़ी गई किसी भी सामग्री को प्रदर्शित कर सकते हैं STDIN। इसलिए

man -l - < file_name

यह भी काम करेगा (लेकिन सावधान रहना manन केवल एक पेजर है, बल्कि फ़ाइल के इनपुट को भी पार्स करता है और इसलिए फ़ाइल सामग्री और प्रदर्शित सामग्री भिन्न हो सकती है)।

तो कैसे STDIN, STDOUTऔर कमांड लाइन तर्क की व्याख्या की जाती है, यह सभी संबंधित डेवलपर तक है।

मुझे उम्मीद है कि मेरा जवाब स्पष्ट बातें कर सकता है।


इस विस्तृत विवरण के लिए धन्यवाद। अपने अंतिम कुछ पैराग्राफों के लिए, आपने व्याख्याओं को तर्क के रूप में man -l - < file_nameबनाने के लिए उपयोग का उल्लेख किया है, लेकिन यह मेरे सिस्टम में विफल रहता है :manSTDINSTDERRman -l - < tee man: invalid option -- l man, version 1.6c
steveyang

आपका स्वागत है। लेकिन मैंने यह उल्लेख नहीं किया कि कम से कम मेरे संस्करण man( मैन-डीबी ) STDINदिए गए तर्कों के साथ दिए गए तर्कों का -lअनुसरण करते हैं -। यह सिर्फ STDINमैन पेज के रूप में डेटा की व्याख्या करता है । मान्य तर्कों के अधिक विस्तृत स्पष्टीकरण के लिए और उनकी व्याख्या कैसे की जाती है आपको संबंधित कार्यक्रम के मैन पेज से परामर्श करना होगा। अपने मामले में परामर्श करें man man। हो सकता है कि आपके लिए भी कुछ ऐसा ही विकल्प हो man। यदि आप किसी विशिष्ट प्रोग्राम के लिए कमांड लाइन तर्क पढ़ना चाहते हैं STDIN xargs(जैसे ऊपर वर्णित है) जाने का रास्ता है।
user1146332

मैं man manऔर मेरे ओएस में एक पाते हैं यह समर्थन नहीं करता है। वैसे भी, मेरे लिए इन दो अवधारणाओं की इस घोषणा के लिए धन्यवाद।
स्टीवेन्ग ऑग

मैंने आपके उत्तर को संपादित किया है इसलिए इसमें lmgtfy के बजाय वास्तव में उपयोगी लिंक हैं। Lmgtfy लिंक को पोस्ट करना 1) असभ्य, 2) अनहेल्दी और 3) वास्तव में एसई साइटों पर फेंका गया है। या तो एक लिंक प्रदान करें या नहीं, लेकिन यदि आप ऐसा करना चुनते हैं, तो वास्तविक जानकारी के लिए एक लिंक प्रदान करें और किसी को यह दिखाने का कोई व्यंग्यात्मक तरीका न दें।
terdon

12

वे पूरी तरह से अलग हैं। कमांड-लाइन तर्क एक सरणी में कार्यक्रम के लिए पारित किए जाते हैं और यह वही कर सकता है जो यह उनके साथ चाहता है; स्टडिन एक इनपुट स्ट्रीम है जिससे प्रोग्राम को डेटा का अनुरोध करना पड़ता है। प्रोग्राम जो प्रक्रिया फ़ाइलों को अक्सर दोनों का समर्थन करने के लिए चुनते हैं, लेकिन उन्हें मैन्युअल रूप से ऐसा करना होगा - वे जांचते हैं कि क्या फ़ाइल नाम कमांड-लाइन तर्क के रूप में पारित किया गया था, और यदि वे इसके बजाय स्टड से नहीं पढ़ते हैं

आप manउस आदमी पृष्ठ को खोजने के लिए स्टडिन को पढ़ने की उम्मीद कर रहे हैं जो इसे प्रदर्शित करना चाहिए, जो वास्तव में अजीब व्यवहार होगा; आप कब ऐसा करेंगे? तथ्य यह है कि catइसकी स्टड प्रदर्शित करता है इस तथ्य की एक कलाकृति है कि यह कुछ और नहीं करता है; मुझे नहीं लगता कि कोई अन्य उपकरण इस तरह से काम करता है। उदाहरण के लिए, grepकोई फ़ाइल नाम ले सकता है या उससे पढ़ सकता है stdin, लेकिन यह डेटा को संसाधित stdinकरता है, यह फ़ाइल नाम नहीं पढ़ता है stdinऔर फिर इसे खोलें

यदि आपको वास्तव में इस व्यवहार की आवश्यकता है, तो आप उपयोग कर सकते हैं xargs, जो एक फाइल को कमांड-लाइन तर्कों में परिवर्तित करता है:

$ xargs man < file_name

या catकॉल के भीतर एक कॉल एम्बेड manकरें:

$ man $(cat file_name)

बैश में, आप उपयोग कर सकते हैं man $(<file_name)
जोर्डन

पुन: "मुझे नहीं लगता कि कोई अन्य उपकरण इस तरह से काम करता है" - पर्ल (<>)लूप STDINमें फाइलनाम के रूप में कमांड या तर्क देगा ...
आरोन डी। मैरास्को

@ AaronD.Marasco मैं मतलब नहीं उपकरण या तो एक तर्क लेता है या stdin से एक फ़ाइल नाम पढ़ता है और पढ़ता है कि फ़ाइल से तर्क
माइकल Mrozek

@MichaelMrozek इस स्पष्टीकरण के लिए धन्यवाद। मैंने जिस उद्देश्य का उपयोग किया है man < file_nameवह इस दो अवधारणाओं को समझने में स्वयं की मदद करना है। आप स्पष्टीकरण को पढ़कर, कार्यान्वयन कमांड लेखक द्वारा तय किया जाता है। इसलिए अगर मैं सही में हूँ, तो findतर्क एसटीडीआईएन को संसाधित करता है?
स्टीवांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.