व्हाट्सएप की आवश्यकता कभी-कभी मेटाचैकर्स के आसपास क्यों होती है?


543

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

bash: syntax error near unexpected token `{:'

कल ऐसा हुआ जब मैंने इसे एक दोस्त के बैश शेल में चलाने की कोशिश की , और फिर मैंने व्हाट्सएप को जोड़ा और इसके :(){ :|:& };:बजाय अचानक,:(){:|:&};:

क्या व्हॉट्सएप मायने रखता है; क्या मैंने अपनी बांह पर एक सिंटैक्स त्रुटि का टैटू गुदवाया है ?!

यह हमेशा zsh में काम करता है , लेकिन बैश में नहीं।

एक संबंधित प्रश्न व्हॉट्सएप के बारे में कुछ भी स्पष्ट नहीं करता है, जो वास्तव में मेरा सवाल है; बैश के लिए व्हाट्सएप की आवश्यकता क्यों है जो इसे सही ढंग से पार्स करने में सक्षम हो?


6
मैंने यहां एक ही सवाल पोस्ट किया (टैटू वाले हिस्से को छोड़कर)।
बेनोइट

3
इसके अलावा, बृहदान्त्र (:) को फ़ंक्शन नाम के रूप में उपयोग नहीं किया जा सकता है (देखें: pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) ... FreeBSD का बिन / श यहां तक ​​कि इस पर एक त्रुटि देता है ...
मार्टिन टूरनोइज

5
@Carpetsmoker: मुझे यकीन नहीं है कि यह कैसे प्रासंगिक है। यह सवाल बैश के बारे में है।
डेनिस

जवाबों:


267

पात्रों की एक सूची है जो BASH में टोकन को अलग करती है। ये अक्षर कहा जाता है अक्षरों से परे वे कर रहे हैं और |, &, ;, (, ), <, >, अंतरिक्ष और टैब । दूसरी ओर, घुंघराले ब्रेसिज़ ( {और }) केवल साधारण अक्षर हैं जो शब्द बनाते हैं।

एक मेटाचैकर के }बाद से पहले दूसरे स्थान को छोड़ना होगा &। इसलिए, आपके टैटू में कम से कम एक अंतरिक्ष चरित्र होना चाहिए।

:(){ :|:&};:

35
आसान समाधान: दो भागों के बीच बाईं ओर प्रत्यारोपण त्वचा के लिए टाउ के पहले भाग को स्थानांतरित करें।

23
मुझे यह शब्द पसंद आया, on the other hand... सज़ा का इरादा है? ;): डी (क्षमा करें, विषय टिप्पणी के लिए।)
ऐशसेन

4
लेकिन यह zsh के लिए अलग है? किस तरह से zsh अलग है?
tfogo

2
इसके अलावा अच्छी व्याख्या, {और इस संदर्भ में शेल कीवर्ड} हैं । केवल अगर वे इस तरह के रूप में मान्यता प्राप्त नहीं हैं - आसपास के रिक्त स्थान / मेटाचैकर्स की कमी के कारण - क्या उन्हें उस शब्द के शाब्दिक भाग के रूप में माना जाता है जिसका वे एक हिस्सा बन जाते हैं। (और फिर ब्रेस विस्तार है, जो एक अलग संदर्भ में होता है।)
mklement0

2
@DmitriChubarov ब्रेसिज़ को कमांड नामों (कार्यों सहित) में अनुमति दी जाती है: {foo} () { echo hello; }"नाम", जैसा bashकि "अल्फ़ान्यूमेरिक वर्णों और अंडरस्कोर से युक्त एक शब्द के रूप में परिभाषित किया गया है , और एक वर्णनात्मक चरित्र या अंडरस्कोर के साथ शुरू होता है, केवल चर नामों पर लागू होता है।
शेपनर

82

बस टैटू ए

#!/bin/zsh

इसके ऊपर शेबंग और आप ठीक हो जाएंगे।


6
अगर हम चुगली कर रहे हैं, तो शेलबंग बिल्कुल भी काम नहीं करेगा, क्योंकि शेल, उम्मीद है कि zsh, इंटरेक्टिव मोड में है, जैसा कि प्रॉम्प्ट द्वारा स्पष्ट किया गया ...
SzG

50

ब्रेसिज़ विशेष प्रतीकों की तुलना में विषम खोजशब्दों की तरह हैं, और उन्हें रिक्त स्थान की आवश्यकता है। उदाहरण के लिए, कोष्ठकों के लिए यह अलग है। की तुलना करें:

(ls)

जो काम करता है, और:

{ls}

जिसका नाम कमांड है {ls}। काम करने के लिए, यह होना चाहिए:

{ ls; }

अर्धविराम एक पैरामीटर के रूप में लिए जा रहे समापन ब्रेस को रोकता है ls

आपको बस इतना करना है कि आप लोगों को बताएं कि आप एक आनुपातिक-फ़ॉन्ट का उपयोग कर रहे हैं, बल्कि एक संकीर्ण संकीर्ण चरित्र के साथ।


12
@DmitriChubarov - यह एक बहुत ही डरपोक चाल है, ब्रेसिज़ के एक पूरी तरह से अलग अर्थ का उपयोग करते हुए। यह अल्पविराम से अलग की गई मानों की सूची का विस्तार करता है, जो इस मामले में सिर्फ है ls
पीटर वेस्टलेक

7
लेकिन ... लड़का ... आप अपने जीवन के बाकी के लिए टैटू के लिए जा रहे हैं! आपने खुद को हर समय एक बेवकूफ के रूप में चिह्नित किया है! और फिर आप इसे सिले होने से पहले ठीक से प्राप्त भी नहीं कर सकते थे? यह दो कदमों से परे है मुझे लगता है कि मैं;; कोई अपराध नहीं है, पाल, मैं बस सोच रहा हूँ।
अल्फ

14
@ इससे पहले कि मैंने इसे गोदने की कोशिश की, लेकिन मैंने इसे अपने चिड़ियाघर में आजमाया, मुझे लगा कि इसमें बैश की तरह ही पार्सिंग है। मुझे मूर्ख, लेकिन मैं सिर्फ लोगों को बताऊंगा कि यह zsh है। :)
स्पाइडन

20
@spydon या आप उन्हें बताएं कि आपने इस उद्देश्य के लिए जगह छोड़ दी है ताकि आपके टैटू से कमांड कॉपी करने वाले लोग गलती से इसे न चलाएं और उनकी मशीन को क्रैश न करें;)
प्रहार करें

4
अरे, अगर यह zsh में मान्य है, तो इसके ठीक ऊपर # (? / Bin / zsh) (या इसके पहले) क्यों नहीं जोड़ा गया? शेल को किसी भी तरह निर्दिष्ट करना अच्छा है।
एडम मिलर

41

हालांकि टैटू फ़ॉन्ट में आसानी से दिखाई नहीं देता है, वास्तव में ब्रेस और कोलन के बीच एक बाइट-ऑर्डर मार्क (बीओएम) है (जब आपको टैटू मिला तो आप पर्याप्त रूप से नशे में आ गए होंगे जो आपने इसे नोटिस नहीं किया था, लेकिन यह वास्तव में है । यह तीन स्पष्ट संभावनाएं छोड़ता है:

  1. जब आप कोड को स्थानांतरित करते हैं तो आप BOM में टाइप करने में विफल रहे हैं। परिणाम GIGO का एक स्पष्ट अनुप्रयोग है। शेल केवल एक BOM को नहीं पहचानता है जो आपके विफल प्रतिलेखन में मौजूद नहीं है।
  2. आपका खोल बहुत पुराना है। यह यूनिकोड वर्णों को नहीं पहचानता है, इसलिए BOM (और शायद अन्य सभी यूनिकोड वर्ण) को पूरी तरह से अनदेखा किया जा रहा है, भले ही एक BOM कहीं भी हो, लेकिन एक फ़ाइल की शुरुआत को शून्य-चौड़ाई, गैर-ब्रेकिंग स्पेस के रूप में माना जाता है ।
  3. आपका खोल बहुत नया है। ZOMBS के रूप में एक BOM का उपयोग पदावनत किया जाता है, और लेखकों ने यूनिकोड के भविष्य के संस्करण को लागू किया है जिसमें इस उपयोग की अनुमति नहीं है।

40

और फिर मैंने व्हाट्सएप को जोड़ा और यह अचानक काम आया ...

यह इस कारण से है कि शेल कैसे पार्स करता है। फंक्शन डेफिनिशन शुरू होने के बाद यानी आपको एक स्पेस की जरूरत होती है {

foo() { echo hey& }
foo() { echo hey&}
foo(){ echo hey&}

वैध हैं। दूसरी ओर,

foo() {echo hey&}

नहीं है।


आप वास्तव में इस तरह एक टैटू की जरूरत है:

यहाँ छवि विवरण दर्ज करें


से स्रोत :

  /* We ignore an open brace surrounded by whitespace, and also
     an open brace followed immediately by a close brace preceded
     by whitespace.  */

एकल टोकन के रूप में व्याख्या किए जाने वाले {कारणों के बाद एक स्थान को छोड़ना {echo


का समतुल्य रूप

:(){ :|:& };:

होने वाला

:(){
:|:& };:

ध्यान दें कि {वैकल्पिक संस्करण के बाद कोई स्थान नहीं है , लेकिन एक लाइन-ब्रेक शेल को {टोकन के रूप में पहचानने का कारण बनता है ।


"{एको को एक टोकन के रूप में व्याख्या किए जाने के कारण {के बाद एक स्थान को छोड़ना।" - तो क्या पार्सर का मानना ​​है कि इसे एक कमांड का सामना करना पड़ा है, जिसे {echoआवश्यक ओपनिंग ब्रेस पहुंचने से पहले बुलाया गया है?
जोनाह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.