कमांड के अंत में डैश "-" का क्या अर्थ है?


78

निम्नलिखित आदेश दिए गए हैं:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

-कमांड के अंत में क्या मतलब है? क्या यह किसी प्रकार का प्लेसहोल्डर है?


3
उल्लेख करने के लिए एक छोटा सा विवरण: -कमांड के अंत में होने की आवश्यकता नहीं है। उदाहरण के लिए ls -l | diff - /old_ls_output.txt:।
मैनटवर्क

जवाबों:


82

इस मामले में, इसका मतलब है 'मानक इनपुट'। इसका उपयोग कुछ सॉफ्टवेयर द्वारा किया जाता है (जैसे tar) जब एक फ़ाइल तर्क की आवश्यकता होती है और आपको इसके बजाय स्टड का उपयोग करने की आवश्यकता होती है। यह एक शेल निर्माण नहीं है और यह आपके द्वारा उपयोग किए जा रहे प्रोग्राम पर निर्भर करता है। संदेह होने पर मैनपेज की जाँच करें!

इस उदाहरण में, मानक इनपुट -fविकल्प का तर्क है । उन मामलों में जहां -आप समर्थित नहीं हैं, आप कुछ का उपयोग tar xvf /proc/self/fd/0कर tar xvf /dev/stdin( या बाद में विभिन्न यूनियनों में व्यापक रूप से समर्थित हैं) से दूर हो सकते हैं।

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


4
यह STDOUTसंदर्भ के आधार पर भी हो सकता है।
बहमट

3
और बहुत कुछ और के रूप में, यह व्याख्या करने के लिए व्यक्तिगत कार्यक्रमों पर निर्भर है।
एलेक्सिस

5
/dev/stdinया /dev/stdoutयदि आप वास्तव में एक इनपुट / आउटपुट स्ट्रीम चाहते हैं, तो इसका उपयोग किया जा सकता है। ध्यान दें कि यह एक स्ट्रीम है, प्रोग्राम जो किसी फ़ाइल में तलाश करना चाहते हैं वह इसके साथ ठीक से काम नहीं कर सकता है जैसा कि -(जैसे ffmpeg) के साथ होगा
Lekensteyn

3
के मामले में bash, हाइफ़न की व्याख्या शेल द्वारा की जाती है। देखें अध्याय 3. विशेष वर्ण - उन्नत बैश-पटकथा गाइड , फिर "stdin या stdout / से रीडायरेक्शन" पाठ [पानी का छींटा] या के लिए खोज। का उपयोग करके bashआप हाइफ़न का उपयोग कर सकते हैं सबसे अधिक स्थानों पर एक फ़ाइल नाम की उम्मीद है। यह एक स्पष्ट पूरक है <| > IMHO
bsd

4
मैं आश्वस्त नहीं हूं कि मामला यही है। सबसे पहले, catहैंडल -(मैनपेज की जांच करें)। catहो सकता है या नहीं का एक शेल-बिल्ट संस्करण हो, लेकिन यह पूरी शेल नहीं है। इसके अलावा, यदि शेल संभाला जाता है -, तो आप कह सकते हैं कि -यह गूंज है और इसका विस्तार कुछ और होगा। इसके बजाय, यह सिर्फ एक डैश (नहीं /dev/stdinया /proc/self/fd/0) echoes । और echo test > -बस एक फ़ाइल बनाई जाती है -, इसलिए यह स्पष्ट रूप से वहां भी नहीं संभालती है। ओह, और आपके द्वारा सूचीबद्ध पृष्ठ यह नहीं कहता है कि यह शेल द्वारा संभाला गया है , यह कहता है कि आप इसका उपयोग कर सकते हैं catऔर diff, दोनों स्पष्ट रूप से समझते हैं।
एलेक्स जूल

13

इस मामले में, -वास्तव में बहुत बेकार है, यह मानते हुए कि आप लिनक्स चला रहे हैं:

जीएनयू टार (लिनक्स पर संस्करण) डिफ़ॉल्ट रूप से मानक इनपुट से अपने इनपुट को स्वीकार करता है। यदि आप इस व्यवहार को नहीं चाहते हैं, और कमांड लाइन तर्क के रूप में फ़ाइल नाम को पास करना चाहते हैं, तो आपको ध्वज को निर्दिष्ट करने की आवश्यकता है f:

tar xf filename

तो यह भी ऐसा ही है

tar x < filename

या, यदि इनपुट आपके उदाहरण के अनुसार gzipped है:

gzip -dc filename | tar x

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

इसके अलावा, उपरोक्त रेखा को सरल बनाया जा सकता है क्योंकि GNU टार gzipको zझंडे को निर्दिष्ट करके अपने माध्यम से इनपुट को स्ट्रीम करने के लिए कहा जा सकता है :

tar xfz filename

- gzipस्पष्ट रूप से कॉल करने की आवश्यकता नहीं है ।


1
नोट: हर नहीं tarहै zविकल्प।
लियोरी

2
लिनक्स के अलावा अधिकांश OS में tarऐतिहासिक कारणों से पहले टेप ड्राइव के लिए डिफ़ॉल्ट है।
गाइल्स

1
@ गिल्स और बीएसडी, और ओएस एक्स,…। लेकिन मैं उत्सुक हूं: कुछ पुराने मेनफ्रेम को छोड़कर अन्य सिस्टम अभी भी इस तरह के संस्करण का उपयोग करते हैं (मेनफ्रेम के अलावा अन्य सिस्टम में टेप ड्राइव भी क्या है)?
कोनराड रुडोल्फ

1
@KonradRudolph सभी तीन प्रमुख BSDs एक टेप ड्राइव /dev/sa0पर ( FreeBSD 9.0, /dev/rst0NetBSD 6.0 और OpenBSD 5.1 पर) डिफ़ॉल्ट हैं । AIX 7.1 के लिए चूक /dev/rmt0। MINIX3 डिफ़ॉल्ट रूप में /dev/sa0। (मैंने प्रत्येक मामले में नवीनतम ओएस संस्करण की जांच की, ये "पुराने मेनफ्रेम" नहीं हैं।) सोलारिस एक फ़ाइल के माध्यम से कॉन्फ़िगर करने योग्य है /etc, जिसमें मुझे लगता है कि एक टेप ड्राइव में चूक। ग्नू टार, शिलिंग टार, ओएसएक्स और बिजीबॉक्स डिफॉल्ट स्टड / स्टडआउट के लिए।
जिल्स

1
@ गिल्स - मैं स्पष्ट कारणों के लिए दूसरे टेप ड्राइव के tarलिए डिफ़ॉल्ट रूप से recompiled । :)
डेविड हार्कनेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.