जब चारों ओर रिक्त स्थान हैं = निषिद्ध चिन्ह?


9

मुझे पता है कि ~ / .bashrc में किसी को असाइनमेंट में संकेतों के आसपास स्पेस नहीं देना चाहिए =:

$ tail -n2 ~/.bashrc 
alias a="echo 'You hit a!'"
alias b = "echo 'You hit b!'"

$ a
You hit a!

$ b
b: command not found

मैं MySQL कॉन्फिग फ़ाइल की समीक्षा कर रहा हूं /etc/my.cnfऔर मुझे यह मिल गया है:

tmpdir=/mnt/ramdisk
key_buffer_size = 1024M
innodb_buffer_pool_size = 512M
query_cache_size=16M

मैं कैसे सत्यापित कर सकता हूं कि =संकेतों के आसपास के स्थान कोई समस्या नहीं हैं?

ध्यान दें कि यह प्रश्न /etc/my.cnfफ़ाइल के लिए विशिष्ट नहीं है , बल्कि सामान्य रूप से * NIX कॉन्फ़िग फ़ाइलों के लिए है। मेरा पहला झुकाव आरटीएफएम के लिए है, लेकिन वास्तव man mysqlमें इस मुद्दे का कोई उल्लेख नहीं है और अगर मुझे प्रत्येक मामले के लिए ऑनलाइन शिकार करने की आवश्यकता है, तो मैं कभी भी कहीं भी नहीं पहुंचूंगा। क्या कोई सम्मेलन या जाँच करने का आसान तरीका है? जैसा कि देखा जा सकता है, कई लोगों ने इस फाइल ( =संकेतों के लिए अलग-अलग सम्मेलनों ) को संपादित किया है और मैं न तो उन सभी को बिना किसी रिक्त स्थान का उपयोग करने के लिए मजबूर कर सकता हूं, और न ही मैं पागल हो सकता हूं सब कुछ जांचना जो कॉन्फ़िगर किया गया हो सकता है और सही नहीं हो सकता है।

संपादित करें: मेरा इरादा यह सुनिश्चित करना है कि वर्तमान में कॉन्फ़िगर की गई फाइलें ठीक से काम कर रही हैं। जब खुद फाइल को कॉन्फ़िगर करते हैं, तो मैं जो कुछ भी पैकेज मेंटेनर को वहां रखता हूं उसके सम्मेलन के साथ जाता हूं।


2
"* NIX कॉन्फ़िगरेशन फ़ाइलें सामान्य रूप से" जैसी कोई चीज नहीं है। यदि मैं अपनी कॉन्फ़िग फ़ाइल में रिक्त स्थान की अनुमति देना चाहता हूं, तो मैं उन्हें अनुमति देने के लिए अपना कार्यक्रम लिखूंगा। यदि मैं चाहता हूं कि मेरी कॉन्फिग फाइल समान संकेतों के बजाय कॉलन या पाइप का उपयोग करें, तो मैं उनका उपयोग करने के लिए अपना कार्यक्रम लिखूंगा। बैश को कोई स्थान नहीं चाहिए। मैसूर उन्हें अनुमति देता है।
हाइमी

जवाबों:


3

मैं जवाब दूंगा कि सामान्य तरीके से - पूरे "यूनिक्स सीखने के अनुभव " पर थोड़ा गौर करें ।

अपने उदाहरण में आप दो उपकरणों का उपयोग करते हैं, और देखें कि भाषा समान है। यह अभी स्पष्ट नहीं है कि वास्तव में क्या उपयोग करना है। बेशक आप उम्मीद कर सकते हैं कि एक स्पष्ट संरचना है , इसलिए आप हमें यह समझाने के लिए कहेंगे।
चारों ओर की जगह के साथ मामला =केवल और उदाहरण है - बहुत से समान-लेकिन-बॉट-काफी मामले हैं।
इसमें एक तर्क होना चाहिए , है ना ?!

नियम है कि कैसे कुछ के लिए कोड लिखने के लिए उपकरण , खोल, डेटाबेस आदि केवल निर्भर क्या इस विशेष उपकरण पर की आवश्यकता है

इसका मतलब है कि उपकरण पूरी तरह से स्वतंत्र हैं , तकनीकी रूप से। तार्किक संबंध मुझे लगता है कि आप बस उम्मीद मौजूद नहीं है

आपके द्वारा देखी जा रही भाषाओं की स्पष्ट समानता प्रोग्राम कार्यान्वयन का हिस्सा नहीं है। समानता मौजूद है क्योंकि डेवलपर्स सहमत थे कि यह कैसे करना है जब उन्होंने इसे किसी विशेष कार्यक्रम के लिए लिखा था। लेकिन मनुष्य केवल आंशिक रूप से सहमत हो सकता है ।

आप जो संबंध देख रहे हैं वह एक सांस्कृतिक चीज है - यह तो कार्यान्वयन का हिस्सा है , न ही भाषा की परिभाषा में



तो, अब जब हमने सिद्धांत को संभाल लिया है, तो व्यवहार में क्या करना है?

एक बड़ा कदम यह स्वीकार करना है कि आपके द्वारा अपेक्षित स्थिरता मौजूद नहीं है - जो कि कारणों को समझते समय बहुत आसान है - मुझे उम्मीद है कि सिद्धांत का हिस्सा इससे मदद करता है।

यदि आपके पास दो उपकरण हैं, जो एक ही विन्यास भाषा का उपयोग नहीं करते हैं (जैसे। दोनों बैश स्क्रिप्टिंग), तो एक के सिंटैक्स का विवरण जानने से दूसरे को समझने में ज्यादा मदद नहीं मिलती है;
तो, वास्तव में, आपको स्वतंत्र रूप से विवरण देखना होगा । सुनिश्चित करें कि आप जानते हैं कि आप प्रत्येक के लिए संदर्भ प्रलेखन कहाँ पाते हैं।

सकारात्मक पक्ष पर, कुछ स्थिरता है जहां आपने इसकी उम्मीद नहीं की थी: एकल उपकरण (या एक ही भाषा का उपयोग करने वाले विभिन्न उपकरण) के संदर्भ में, आप काफी हद तक सुनिश्चित कर सकते हैं कि वाक्यविन्यास सुसंगत है।
आपके mysqlउदाहरण में, इसका मतलब है कि आप मान सकते हैं कि सभी लाइनों में एक ही नियम है। इसलिए नियम " प्रासंगिक= है पहले और बाद में " प्रासंगिक नहीं है

एक उपकरण की भाषा या स्क्रिप्टिंग भाषा को सीखना या उपयोग करना कितना कठिन है, इसमें व्यापक अंतर हैं । यह कुछ इस तरह हो सकता है " cmd-foo.conf में सूची फू मान , प्रति पंक्ति एक"। यह एक पूर्ण स्क्रिप्टिंग भाषा हो सकती है जिसका उपयोग कहीं और भी किया जाता है। फिर आपके पास कॉन्फ़िगरेशन लिखने के लिए एक शक्तिशाली उपकरण है - और कुछ मामलों में यह सिर्फ अच्छा है, दूसरों में आपको वास्तव में इसकी आवश्यकता होगी। जटिल उपकरण , या संबंधित उपकरणों के बड़े अकाल कभी-कभी बहुत जटिल विशेष कॉन्फ़िगरेशन फ़ाइल सिंटैक्स का उपयोग करते हैं - (कुछ प्रसिद्ध उदाहरण हैं और )। अन्य एक सामान्य स्क्रिप्टिंग का उपयोग करते हैं


sendmailvim
भाषा को आधार के रूप में, और उस भाषा को विशेष आवश्यकताओं का समर्थन करने के लिए , जटिल तरीकों से कुछ समय के लिए विस्तारित करें , जैसा कि भाषा अनुमति देती है। यह एक डोमेन-विशिष्ट भाषा ( DSL ) का एक बहुत विशिष्ट मामला होगा ।


यह स्वीकार किया जाता है कि यह उत्तर है जो अधिकांश प्रश्न के दृष्टिकोण से उत्तर को संबोधित करता है। धन्यवाद!
dotancohen

20

बैश एक ऐसी रेखा की व्याख्या करेगा जिसमें पाठ है जिसके बाद =एक चर के लिए असाइनमेंट के रूप में है, लेकिन यह एक पंक्ति की व्याख्या करेगा जिसमें पाठ है जिसमें एक तर्क के साथ एक कमांड के रूप में एक स्थान है।

var=assignment बनाम command =argument

बैश स्क्रिप्ट इस सिद्धांत पर काम करती है कि स्क्रिप्ट में सब कुछ ऐसा है जैसे आपने इसे कमांड लाइन में टाइप किया है।

कॉन्फ़िगरेशन फ़ाइलों में bash(या किसी अन्य शेल) द्वारा व्याख्या नहीं की जाती है , यह कॉन्फ़िगरेशन फ़ाइल को पढ़ने के लिए उपयोग किए जाने वाले पार्सर द्वारा निर्धारित किया जाएगा। कुछ पार्सर्स स्पेस लेंगे, कुछ नहीं। यह उस मामले में आवेदन पर निर्भर है। व्यक्तिगत रूप से, मैं जो भी सम्मेलन डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल का उपयोग किया है के साथ जाना।


धन्यवाद। मुझे इस बात की चिंता है कि अब और भविष्य में मौजूदा फ़ाइलों की जाँच कैसे की जा सकती है, जो कि अन्य उदीयमान प्रकारों द्वारा कॉन्फ़िगर की गई हैं। जब आप स्वयं फ़ाइलों को कॉन्फ़िगर करते हैं, तो मैं सुझाव देता हूं कि आप जो भी पैकेज मेंटेनर रखते हैं, उसके सम्मेलन में जाते हैं। मैंने स्पष्ट करने के लिए प्रश्न संपादित किया है।
डॉटनकॉहेन

1
मुझे लगता है कि यदि आपकी मौजूदा फ़ाइलें जाँच रही हैं, तो मैं उत्पाद के दस्तावेज़ीकरण की जाँच करूँगा और उदाहरण के तौर पर इसका उपयोग करूँगा। मान लें कि आपके पास प्रलेखन है और यह एक कस्टम निर्मित एप्लिकेशन नहीं है। यदि यह एक कस्टम अनुप्रयोग था, तो जो कुछ पहले से था, मैं उसके साथ रहना चाहूँगा। "अगर यह नहीं टूटा है, तो इसे ठीक न करें"
लॉरेंस

दुर्भाग्य से, उनमें से कुछ कर रहे हैं तोड़ दिया। इसलिए मैं पूछ रहा हूँ!
१०:१

गोले में, कभी एक बराबर के आसपास के स्थानों का उपयोग न करें। किसी भी चीज में जो शेल नहीं है, हमेशा रिक्त स्थान का उपयोग करें। आप grep का उपयोग करके मौजूदा फ़ाइलों का ऑडिट कर सकते हैं: 'grep "[^] = [^]" / etc / *' = जिनके पास स्पेस नहीं है, फ़ाइलों को खोजने के लिए।
क़्रीस

2
@dotancohen (1.) किसी भी कॉन्फिगर फाइल के लिए, कम से कम एक सेटिंग होनी चाहिए कि अगर यह टूट जाए तो जांचना आसान होगा। एक कॉन्फिगर फाइल स्पेस को अनुमति देती है या नहीं, यह लगातार भर में करना चाहिए। (2.) आप हमेशा एक एप्लिकेशन डाउनलोड कर सकते हैं और डिफ़ॉल्ट कॉन्फ़िगर कर सकते हैं यह जहाजों के साथ कॉन्फ़िगर करता है। (3.) आप हमेशा रिक्त स्थान पूरी तरह से छोड़ सकते हैं। a = bहमेशा स्वीकार्य नहीं हो सकता है लेकिन a=bहमेशा काम करना चाहिए।
दो-बिट अल्केमिस्ट

4

.bashrc, bash के लिए एक कॉन्फिग फाइल से ज्यादा कुछ नहीं है, जैसे my.cnf, php.ini, httpd.conf या एक लॉन्च प्लास्ट। प्रत्येक का अपना सिंटैक्स होता है, जो लॉन्च के एक्सएमएल टैग सूप के लिए बैश के नो-स्पेस असाइनमेंट से होता है (इसमें बाइनरी वर्जन भी है: -ओ)

कोई ठोस सम्मेलन नहीं हैं, और आप पहले से ही यूनिक्स के प्रमुख निर्देश की खोज कर चुके हैं: द फाइन मैनुअल पढ़ें ।


1
.bashrcहै बैश के लिए एक कॉन्फ़िग फ़ाइल। .bashrcएक शेल स्क्रिप्ट है जो हर बार एक बैश प्रक्रिया शुरू होने पर चलती है। इसका उपयोग बैश को कॉन्फ़िगर करने के लिए किया जा सकता है, लेकिन इसका उपयोग सभी प्रकार की अन्य चीजों को भी करने के लिए किया जा सकता है: यह एक स्क्रिप्ट है, एक कॉन्फिग फाइल नहीं।
जोश

3

कुछ प्रोग्राम, उदाहरण के लिए, कॉन्फ़िगरेशन फ़ाइल की जाँच की पेशकश करते हैं:

postfix check

अन्यथा आप रिपॉजिटरी से मूल कॉन्फिग फाइल प्राप्त कर सकते हैं और उनकी तुलना करंट से कर सकते हैं।


वास्तव में, ऐसा लगता है कि यह वास्तव में मुख्य मुद्दे को संबोधित करता है। धन्यवाद!
डैनकॉहेन

2

=जब आप असाइनमेंट करते हैं, तो साइन के आसपास रिक्त स्थान हमेशा समस्या होती है bash। यहां कोई अपवाद नहीं है, =यदि आप एक वैध सरल असाइनमेंट (कोई विस्तार नहीं, कोई अंकगणित, कोई सरणी असाइनमेंट नहीं) प्राप्त करना चाहते हैं, तो आपको सभी रिक्त स्थान को निकालना होगा bash

कॉन्फ़िग फ़ाइल के लिए, क्योंकि प्रत्येक सॉफ़्टवेयर के पास अपनी कॉन्फ़िगर फ़ाइल को पार्स करने के लिए अपना स्वयं का पार्सर है, bashजिसका कोई संबंध नहीं है। विन्यास फाइल में किस सिंटैक्स की अनुमति है यह जानने के लिए आपको दस्तावेज़ीकरण पढ़ना चाहिए।

एक उदाहरण है mysql, इसकी init स्क्रिप्ट में /etc/init.d/mysqld, इसके लिए एक पार्सर है my.cnf:

# Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[  ]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
      if test -x "$d/bin/mysql_print_defaults"
      then
        print_defaults="$d/bin/mysql_print_defaults"
        break
      fi
    done
  fi

वहाँ में एक अपवाद है (( var = 12 ))या var=( value )या $((var = 12))या${var[foo = 12]}
स्टीफन Chazelas

@ स्टीफनचेज़ेलस: इस प्रश्न में उन मामलों के बारे में जानकारी नहीं थी। धन्यवाद।
cuonglm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.