`बैश` के विकल्पों में अंतिम" - "(हाइफ़न) का क्या अर्थ है?


15

में इस ट्यूटोरियल हम निम्न आदेश पर अमल करने की जरूरत है:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

मतलब के -बाद अंतिम (हाइफ़न) क्या है bash?

मैंने इसके साथ बहुत सारी कमांड देखी हैं, और अपने आप को एक तार्किक व्याख्या नहीं पा सका और न ही यह पाया कि इसके लिए एक Google खोज को कैसे सुधारना है। क्या यह पाइप्ड कमांड का आउटपुट है?



2
नेटवर्क से सामान डाउनलोड करना और इसे सीधे sudo bashध्वनियों में डालना वास्तव में डरावना है। एक ऐसे ट्यूटोरियल की तलाश करें जो ऐसी प्रथाओं को प्रोत्साहित न करे।
हमखोल ने मोनिका डेस

इसकी npm ट्यूटोरियल, लेकिन मैं आपसे सहमत हूं ...
उमर बिस्टामि

1
यदि आपको उनमें प्रतीकों के साथ चीजों की खोज करने की आवश्यकता है, तो प्रयास करें symbolhound.com
जो

जवाबों:


31

बैश कुछ गैर-मानक तरीके से व्यवहार करता है जब यह आता है -

POSIX कहता है:

दिशानिर्देश 10:
पहला --तर्क जो विकल्प-तर्क नहीं है, उसे विकल्प के अंत का संकेत देने वाले परिसीमन के रूप में स्वीकार किया जाना चाहिए। किसी भी निम्न तर्क को ऑपरेंड के रूप में माना जाना चाहिए, भले ही वे -चरित्र से शुरू हों ।

[...]

दिशानिर्देश 13:
उपयोगिताओं के लिए जो पढ़ने या लिखने के लिए खोली जाने वाली फ़ाइलों का प्रतिनिधित्व करने के लिए ऑपरेंड का उपयोग करते हैं, -ऑपरेंड का उपयोग केवल मानक इनपुट (या मानक आउटपुट का मतलब है जब यह संदर्भ से स्पष्ट है कि आउटपुट फ़ाइल निर्दिष्ट किया जा रहा है) या ए फ़ाइल नाम -

तथा

जहाँ इन दिशानिर्देशों के अनुरूप POSIX.1-2017 के शेल और यूटिलिटीज़ वॉल्यूम में वर्णित एक उपयोगिता को स्वीकार करने, या स्वीकार नहीं करने के लिए आवश्यक है, -मानक इनपुट या आउटपुट का मतलब ऑपरेंड , यह उपयोग OPERANDS अनुभाग में समझाया गया है। अन्यथा, यदि ऐसी उपयोगिता फ़ाइलों का प्रतिनिधित्व करने के लिए ऑपरेंड का उपयोग करती है, तो यह कार्यान्वयन-परिभाषित है कि क्या ऑपरेंड -मानक इनपुट (या मानक आउटपुट) के लिए खड़ा है, या नाम वाली फ़ाइल के लिए -

लेकिन फिर man 1 bashपढ़ता है:

एक --विकल्प के अंत का संकेत देता है और आगे के विकल्प प्रसंस्करण को निष्क्रिय कर देता है। तर्कों और तर्कों के बाद किसी भी तर्क --को माना जाता है। के एक तर्क के -बराबर है --

तो बैश के लिए -न तो मानक इनपुट और न ही एक फ़ाइल है, इसलिए कुछ हद तक गैर-मानक है।

अब आपका विशेष मामला:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

मुझे संदेह है कि इस कमांड के लेखक को इस मामले में एहसास नहीं हो सकता -है --। मुझे संदेह है कि लेखक यह सुनिश्चित करना चाहता था कि bashइसके मानक इनपुट से पढ़ा जाएगा, उन्होंने -दिशानिर्देश 13 के अनुसार काम करने की उम्मीद की ।

लेकिन यहां तक ​​कि अगर यह दिशानिर्देश के अनुसार काम करता है, -तो यहां अनावश्यक होगा क्योंकि bashपता चलता है कि इसका मानक इनपुट एक पाइप है और तदनुसार (जब तक -cकि आदि नहीं दिया जाता है) कार्य करता है।

फिर भी -दिशानिर्देश के अनुसार काम नहीं करता है, यह काम करता है --। अभी भी --यहाँ अनावश्यक है क्योंकि इसके बाद कोई तर्क नहीं हैं।

मेरी राय में अंतिम -कुछ भी नहीं बदलता है। इसके बिना कमांड काम करेगा।

यह देखने के लिए कि कैसे --और -सामान्य रूप से उपयोगी हो सकता है, नीचे दिए गए उदाहरण का अध्ययन करें।


catमेरे Kubuntu में दोनों के दिशा-निर्देशों का अनुसरण करता है और मैं की उपयोगिता का प्रदर्शन करने के लिए उपयोग करेंगे -और --

एक फ़ाइल नाम fooमौजूद है। यह फाइल प्रिंट करेगा:

cat foo

एक फ़ाइल नाम --helpमौजूद है। यह फाइल प्रिंट नहीं करेगा:

cat --help

लेकिन यह नाम की फाइल को प्रिंट करेगा --help:

cat -- --help

यह --helpमानक इनपुट से जो कुछ भी आता है उसके नाम वाली फ़ाइल को संक्षिप्त करेगा :

cat -- --help -

ऐसा लगता है कि आपको वास्तव में ज़रूरत नहीं है --, क्योंकि आप हमेशा पास कर सकते हैं, ./--helpजिसे सुनिश्चित करने के लिए एक फ़ाइल के रूप में व्याख्या की जाएगी। लेकिन गौर कीजिए

cat "$file"

जब आप पहले से नहीं जानते हैं कि चर की सामग्री क्या है। आप ./इसके लिए पहले से तैयारी नहीं कर सकते , क्योंकि यह एक निरपेक्ष मार्ग हो सकता है और ./इसे तोड़ देगा। दूसरी ओर यह एक फ़ाइल हो सकती है जिसका नाम --help(क्योंकि क्यों नहीं?)। इस मामले --में बहुत उपयोगी है; यह एक बहुत मजबूत आदेश है:

cat -- "$file"

6

में man bash, एकल-वर्ण विकल्पों के अंत में है: -

--    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.

यदि आपने पूरी कमांड उद्धृत की है, तो मैं इस उदाहरण के -बाद उपयोग करने का कोई कारण नहीं देख सकता bash, लेकिन इससे कोई नुकसान नहीं है।


आपके उत्तर के लिए धन्यवाद, हाँ मैंने पूरा कमांड उद्धृत किया है। इसलिए कुछ भी - या - एक विकल्प के रूप में नहीं देखा जाएगा, लेकिन एक फ़ाइल नाम या तर्क के रूप में, क्या आप कृपया एक उदाहरण दे सकते हैं जहां यह उपयोगी है?
उमर बिस्तिमी

1
यह वास्तव में एक स्क्रिप्ट की अनुमति देता है जिसका नाम शुरू होता है -, एक अप्रत्याशित आवश्यकता, लेकिन -/ --यह संभव बनाता है।
AFH

1
@OmarBISTAMI एक कमांड को कोट करने से यह प्रभावित होगा कि शेल इसे कैसे एक्सपैंड करता है, लेकिन इसका पालन करने वाले किसी भी तर्क को प्रभावित नहीं करेगा। यदि आप मान्य तर्कों के आसपास उद्धरणों का विस्तार करते हैं, तो वे कमांड नाम का हिस्सा बन जाते हैं, जो आप या तो नहीं चाहते हैं। कुछ कमांड हैं जो फ़ाइल नामों को तर्क के रूप में लेते हैं, लेकिन डिफ़ॉल्ट रूप से मानक इनपुट का उपयोग नहीं करते हैं। एक आकस्मिक उदाहरण आपको दो फाइलों के बीच इनपुट (एक टर्मिनल या एक पाइप से) सैंडविच की अनुमति देता है। cat file1 - file2 > file3
जो

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash -इसका मतलब है कि bashस्टडिन के लिए इंतजार कर रहा है। तो व्यावहारिक रूप से बैश, जो कुछ भी बाईं ओर है कमांड द्वारा लौटाया जाएगा|

एक समान लेकिन आसान उदाहरण होगा:

echo hello | cat - यहाँ, cat'हैलो' प्रिंट करेगा। क्यों? क्योंकि 'हैलो' को बिल्ली के माध्यम से भेजा जा रहा है |और catइसे भेजे गए किसी भी चीज़ का इंतजार कर रहा है

अब पूरी कमांड को दो में तोड़ते हैं:

curl -sL https://rpm.nodesource.com/setup_6.x

यह कर्ल कमांड कुछ ऐसा लौटाएगा जिसे बाश द्वारा समझा और निष्पादित किया जा सकता है

फिर हमारे पास एक पाइप है |जो कर्ल कमांड द्वारा लौटाए गए आउटपुट को पाइप के दाईं ओर भेजेगा sudo -E bash -। अंत में sudo -E bash -, बैश किसी भी चीज़ को निष्पादित करने के लिए तैयार है जिसे उसे भेजा गया है

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