फ़ाइल नाम के स्थान पर डैश (-) का उपयोग


110

एक कमांड के लिए, यदि -फ़ाइल नाम के स्थान पर एक तर्क के रूप में उपयोग करने का मतलब STDIN या STDOUT होगा।

  1. लेकिन इस उदाहरण में, यह नाम के साथ एक फ़ाइल बनाता है -:

    echo hello > -

    मैं -इस उदाहरण में कैसे बना सकता हूँ STDOUT?

  2. इसके विपरीत, मैं कैसे उदाहरण के रूप में -नामित एक फ़ाइल का मतलब कर सकते हैं -:

    cat -

3
चूंकि मुझे स्पष्ट रूप से सीधे टिप्पणी करने के लिए 50 प्रतिष्ठा हासिल करनी है ... पर / देव / स्टडिन / देव / स्टडआउट टिप्पणी, एआईएक्स, जो एक वैध यूनिक्स व्युत्पन्न है, इन छद्मवेष नहीं हैं। और, एक और टिप्पणी के रूप में, LINUX किसी भी मामले में एक UNIX व्युत्पन्न नहीं है। यह एक POSIX- आज्ञाकारी कार्यबल है, और इस बिंदु पर UNIX-ish OS का सबसे लोकप्रिय है, लेकिन कोई गलती न करें, यह कोई UNIX नहीं है। लेकिन, यहां जवाबों का सार सही है। "-" संकेतन को शेल द्वारा विशेष के रूप में व्याख्या नहीं किया गया है, और इस प्रकार प्रत्येक व्यक्ति को सीधे एआरजी के रूप में पारित किया जाता है। यदि एप्लिकेशन पहचान नहीं करता है

2>&-निर्माण भी हैं , जिसका अर्थ है "करीब वर्णनकर्ता 2"।
user3132194

@ user95873, जो मैं आपको कहना चाहता हूं वह यह है: जबकि लिनक्स यूनिक्स-जैसा है, हर यूनिक्स-जैसा (या सच यूनिक्स) लिनक्स नहीं है । मामला यह है कि क्या लिनक्स सच है या UNIX नहीं है (अर्थात एकल UNIX विशिष्टता का अनुपालन करता है) का संबंध / dev / std {in, out, wrong} मुद्दे से नहीं है। जैसा कि / dev / std {in, out, इरेट} जोड़ा गया है, अनुपलब्ध है
साशा

जवाबों:


156

-स्टीन / स्टडआउट के लिए फ़ाइल नाम के रूप में उपयोग करना एक सम्मेलन है जो बहुत सारे कार्यक्रमों का उपयोग करता है। यह फ़ाइल नाम का कोई विशेष गुण नहीं है। कर्नेल -विशेष के रूप में नहीं पहचानता है इसलिए किसी भी सिस्टम कॉल -को एक फ़ाइल नाम के रूप में संदर्भित -करता है, शब्दशः फ़ाइल नाम के रूप में उपयोग करेगा ।

बैश पुनर्निर्देशन के साथ, -एक विशेष फ़ाइल नाम के रूप में मान्यता प्राप्त नहीं है, इसलिए बैश शाब्दिक फ़ाइल नाम के रूप में उपयोग करेगा।

जब catस्ट्रिंग -को फ़ाइल नाम के रूप में देखा जाता है, तो इसे इसे स्टड के पर्याय के रूप में माना जाता है। इसके आस-पास जाने के लिए, आपको उस स्ट्रिंग को बदलना होगा जो catइस तरह से देखती है कि यह अभी भी एक फ़ाइल के रूप में संदर्भित होती है -। ऐसा करने का सामान्य तरीका एक मार्ग के साथ फ़ाइल नाम को उपसर्ग करना है - ./-या /home/Tim/-। इस तकनीक का उपयोग लगभग ऐसे ही मुद्दों को प्राप्त करने के लिए भी किया जाता है जहां कमांड लाइन विकल्प फ़ाइल नाम के साथ टकराते हैं, इसलिए एक फ़ाइल जिसे प्रोग्राम के लिए कमांड लाइन विकल्प के ./-eरूप में प्रकट नहीं होता है -e, उदाहरण के लिए।


37
यह जोड़ने लायक है /dev/stdinऔर /dev/stdoutसार्वभौमिक रूप से उपलब्ध है और इसका उपयोग -सम्मेलन के स्थान पर किया जा सकता है ।
22:00

इस catमामले में, तर्क को सूचीबद्ध करने के बजाय पुनर्निर्देशन का उपयोग करने से मदद मिल सकती है cat <-:; हालाँकि, यह एक समय में एक से अधिक फ़ाइल को मिलाने के साथ मिलाना और मेल करना कठिन होगा।
jtd

10
@jmtd: / dev / std {in, out} सार्वभौमिक रूप से उपलब्ध नहीं हैं। सभी यूनिक्स के पास नहीं है।
कैम

2
दिलचस्प है, मुझे लगता है कि वे POSIX का हिस्सा थे (लेकिन पुष्टि नहीं कर सकते)। वे कम से कम लिनक्स, बीएसडी और सोलारिस पर मौजूद हैं। क्या आप एक आधुनिक UNIX का उदाहरण दे सकते हैं जिसमें उनकी कमी है?
jmtd 8

1
@camh यकीन नहीं है अगर आपको सूचना मिली, और यह एक बहुत ही पुराना विषय है; अगर आप कर सकते हैं तो मुझे यकीन नहीं है, लेकिन अगर आप सवाल का जवाब जानते हैं तो मैं बहुत उत्सुक हूं jmtd। :)
कुंडा

18
  1. इसके बजाय echo hello > -, आप उपयोग कर सकते हैं echo hello > /dev/stdout

    जबकि '-' एक ऐसा अधिवेशन है जिसे प्रत्येक कार्यक्रम को समर्थन देने के लिए लागू करना होता है /dev/stdin, /dev/stdoutऔर /dev/stderrजब ओएस (कम से कम सोलारिस, लिनक्स और बीएसडी करते हैं) द्वारा समर्थित है, तो आवेदन से स्वतंत्र है और फिर आप के रूप में काम करेंगे इरादा करना।


9

जैसा कि कैम ने उल्लेख किया है , -कुछ कार्यक्रमों द्वारा उपयोग किया जाने वाला नामकरण सम्मेलन है। यदि आप इन धाराओं को एक फ़ाइल डिस्क्रिप्टर के साथ संदर्भित करना चाहते हैं जो शेल को पहचान लेगा , तो आप नाम का उपयोग करने के बजाय /dev/stdinया उसके /dev/stdoutबजाय jiliagre सही थे । उन फ़ाइल नामों को किसी भी जगह काम करना चाहिए एक सामान्य फ़ाइल नाम काम करेगा।

  1. कहा जा रहा है, आपका पहला उदाहरण मूर्खतापूर्ण है। कोई भी आउटपुट जिसे रीडायरेक्ट ऑपरेटर द्वारा किसी फ़ाइल में लिखने के लिए पकड़ा जाएगा, वह पहले से ही स्टैंडर्ड-आउटपुट है, इसलिए इसे रीडायरेक्ट करके वापस यह लिखना कि यह कहाँ से आया है बेकार है। आपके द्वारा उपयोग किया जाने वाला व्यवहार पाइप है, न कि पुनर्निर्देशित:

    echo hello |
  2. अपने दूसरे उदाहरण में आपको बस कुछ संकेत देने की ज़रूरत है कि आप उस नाम की एक लैटरल फ़ाइल चाहते हैं, न कि आंतरिक उपनाम। आप इस तरह से फ़ाइल के लिए एक पथ निर्दिष्ट करके यह सबसे आसान कर सकते हैं:

    cat ./-

6

1 के लिए, कार्यक्रम को इसका समर्थन करना होगा। आप सिर्फ मनमाने ढंग से इसका इस्तेमाल नहीं कर सकते। 2 के रूप में, (जैसे, cat < -) से पुनर्निर्देशित इनपुट ।


1

'-' दृष्टिकोण में बहुत सारी समस्याएं हैं। सबसे पहले इसे '-' वर्ण की व्याख्या की आवश्यकता होती है और कई कार्यक्रम ऐसी व्याख्या नहीं करते हैं। और इसके अलावा, कुछ प्रोग्राम हैं जो कमांड लाइन विकल्पों के अंत को चिह्नित करने वाले एक सीमांकक के रूप में एक हाइफ़न की व्याख्या करते हैं। कार्यक्रमों को फ़ाइल नाम के तर्कों के साथ काम करने के लिए लिखा जाता है, '-' दृष्टिकोण एक हैक, अच्छा लेकिन कमजोर है।

सबसे अच्छा तरीका है:

$ echo hello > /dev/fd/1

/dev/stdout का एक प्रतीकात्मक लिंक है /dev/fd/1


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