पाइप के बगल में रिक्त स्थान


17

मैंने देखा है history | grep blahऔर history |grep blah; और history|grep blahयह भी काम करता है, हालांकि कोई भी इसका उपयोग करने के लिए कभी नहीं लगता है।

क्या रिक्त स्थान में कोई महत्व है (जैसे अलग-अलग कमांड से / के लिए पाइपिंग को अलग-अलग स्थानों के उपयोग की आवश्यकता होती है), या क्या यह हमेशा मनमाना है?


13
पठनीयता, ज्यादातर।
jasonwryan

1
|पाइप या ;अर्धविराम का उपयोग अधिकांश शेल (बैश, ksh, tcsh) कमांड के विभाजक के रूप में किया जाता है। जब से पहले और बाद में सफेद स्थान को कोट में संलग्न नहीं किया गया है।
आर्केमोर

जवाबों:


24

bashकई मेटाचैकर्स को परिभाषित करता है । से man bash:

मेटाचैकर
एक चरित्र, जब अयोग्य, शब्दों को अलग करता है। निम्नलिखित में से एक:
| &; () <> स्पेस टैब

क्योंकि मेटाचेचर्स अलग-अलग शब्दों को कहते हैं, इससे कोई फर्क नहीं पड़ता कि वे रिक्त स्थान से घिरे हैं। पाइप प्रतीक, |एक मेटाचैकर है और इसलिए, जैसा कि आपने देखा, उसे इसके चारों ओर रिक्त स्थान की आवश्यकता नहीं है।

ध्यान दें कि [ , ], {, }, और =कर रहे हैं नहीं अक्षरों से परे। इसके विपरीत, उनका अर्थ, इस बात पर दृढ़ता से निर्भर करता है कि वे खाली जगह से घिरे हैं या नहीं।

रिक्त स्थान कब हैं और इसकी आवश्यकता के उदाहरण नहीं हैं

जैसा कि आपने देखा, इससे कोई फर्क नहीं पड़ता कि |रिक्त स्थान घिरा हुआ है या नहीं । आइए कुछ उदाहरणों पर विचार करें जो आमतौर पर उपयोगकर्ताओं को भ्रमित करते हैं। विचार करें:

$ (date)
Sun Mar  1 12:47:07 PST 2015

ऊपर के परेंस बल date भाग को उप-क्रम में चलाने के आदेश देता है। क्योंकि (और )मेटाचट्रैक्टर्स हैं, इसलिए किसी स्थान की आवश्यकता नहीं है। इसके विपरीत:

$ {date}
bash: {date}: command not found

के बाद से {और }कर रहे हैं नहीं मेटावर्ण, खोल व्यवहार करता है {date}एक शब्द के रूप में। dateकमांड की तलाश करने के बजाय , यह नाम की कमांड की तलाश करता है {date}। क्योंकि यह एक नहीं मिलता है, एक त्रुटि परिणाम।

एक और आम समस्या है test कमांड है। निम्नलिखित कार्य सफलतापूर्वक:

$ [ abc ] && echo Yes
Yes

रिक्त स्थान निकालें और एक त्रुटि उत्पन्न होती है:

$ [abc] && echo Yes
bash: [abc]: command not found

क्योंकि [और ]कर रहे हैं नहीं मेटाचैकर , इसलिए शेल [.bashrc]एक ही शब्द के रूप में व्यवहार करता है और परिणाम, dateउदाहरण की तरह , एक त्रुटि है।

असाइनमेंट स्टेटमेंट स्पेस के प्रति भी संवेदनशील होते हैं। निम्नलिखित असाइनमेंट सफल है:

$ v=date
$ echo $v
date

एक स्थान जोड़ें और असाइनमेंट विफल हो जाता है:

$ v= date
Sun Mar  1 12:55:05 PST 2015

ऊपर में, शेल अस्थायी रूप से सेट होता है v से खाली करने के लिए होता है और फिर dateकमांड निष्पादित करता है ।

इससे पहले कि =कोई विफलता का कारण बनता है एक अलग स्थान जोड़ें :

$ v =date
bash: v: command not found

यहां, शेल vतर्क के साथ कमांड निष्पादित करने का प्रयास करता है =date। त्रुटि इसलिए है क्योंकि इसमें कोई आदेश नाम नहीं मिला v


1
मैं हाल ही में असाइनमेंट स्टेटमेंट का शिकार हुआ। मैं पहले और बाद में रिक्त स्थान था =। डिबग करने के लिए कुछ समय लिया।
पगड़ी

3

पाइप आपको किसी अन्य के इनपुट के रूप में प्रोग्राम के आउटपुट का उपयोग करने देते हैं ...

जहाँ तक रिक्त स्थान है, इसकी सिर्फ पठनीयता / कार्मिक वरीयता जैसे @jasonwryan का उल्लेख है।

"पहले और बाद में एक स्पेस-बार" | आदर्श है ...।

आप इसका उपयोग कॉलम -t के साथ कर सकते हैं, न केवल अपने एक लाइनर को साफ करने के लिए, बल्कि अपने आउटपुट के लिए भी।

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp

2

एक मामला है जहां यह रिक्त स्थान का उपयोग नहीं करने के लिए उपयोगी हो सकता है। यदि आप यूएस-अमेरिकन लेआउट का उपयोग नहीं कर रहे हैं, तो आपको कुछ संयोजनों का उपयोग करने के लिए मजबूर किया जा सकता है जैसे AltShiftLकि एक पाइप इनपुट करना। हालांकि यह प्रति समस्या नहीं है, एक परिणाम यह है कि कभी-कभी आप गैर-मुद्रण वर्णों को उस वर्ण से पहले या बाद में भी इनपुट करते हैं। उदाहरण के लिए, एक फ्रेंच मैकबुक प्रो कीबोर्ड पर, मुझे AltShiftLइनपुट का उपयोग करना होगा |। जब आप जल्दी टाइप करते हैं, तो आप गलती से यह टाइप कर सकते हैं: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

यदि आपको पता नहीं है कि AltShiftSpaceएक अलग स्थान (नॉन-ब्रेकिंग-स्पेस ( U + 00A0 )) इनपुट करता है , तो निम्न त्रुटि को समझना मुश्किल हो सकता है:zsh: command not found:  tail


1

इस मामले में रिक्त स्थान का एकमात्र महत्व सौंदर्यशास्त्र है।
या दूसरे शब्दों में आज्ञाओं को मानव के लिए अधिक पठनीय बनाने के लिए उपयोगी है।

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