क्या फ़ंक्शंस, उपनाम और निष्पादन में हाइफ़न के साथ समस्याएं हैं?


25

अपने परीक्षण में (बैश और जेड शेल में), मैंने फ़ंक्शंस या उपनामों या निष्पादन योग्य शेल स्क्रिप्ट्स के साथ कोई समस्या नहीं देखी, जिनके नाम में हाइफ़न हैं, लेकिन मुझे विश्वास नहीं है कि यह सभी गोले और सभी उपयोग मामलों में ठीक होगा ।

इसका कारण मैं यह करना चाहूंगा कि एक हाइफन एक अंडरस्कोर की तुलना में टाइप करना आसान है, और इसलिए तेजी से और चिकनी है।

एक कारण यह है कि मैं विश्वास करने में संकोच कर रहा हूं कि यह कोई समस्या नहीं है कि कुछ भाषाओं में (उदाहरण के लिए रूबी) हाइफ़न की व्याख्या माइनस साइन के रूप में की जाएगी, भले ही इसके चारों ओर रिक्त स्थान के बिना। यह मुझे आश्चर्यचकित नहीं करेगा अगर ऐसा कुछ गोले में हो सकता है, जहां एक स्थान के बिना भी हाइफ़न को एक विकल्प के संकेत के रूप में व्याख्या की जाती है।

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

क्या हाइफ़न से बचने का कोई कारण है?

जवाबों:


32

POSIX और हाइफ़न: कोई गारंटी नहीं

POSIX मानक के अनुसार, एक फ़ंक्शन नाम एक मान्य नाम होना चाहिए और एक नाम इसमें शामिल हो सकता है:

3.231 नाम
शेल कमांड लैंग्वेज में, एक शब्द जिसमें केवल अंडरस्कोर, अंक और वर्णक्रमीय अक्षरों में से एक होता है। नाम का पहला वर्ण कोई अंक नहीं है।

इसके अतिरिक्त, एक उपनाम एक मान्य होना चाहिए अन्य नाम है, जो से मिलकर कर सकते हैं:

3.10 उपनाम नाम
शेल कमांड भाषा में, एक ऐसा शब्द है जिसमें पोर्टेबल वर्ण सेट और निम्न में से किसी भी अक्षर से केवल अंक, अंक और वर्णमाला शामिल है: '!', '%', ',', '@'।

विस्तार के रूप में अन्य नामों के साथ कार्यान्वयन अन्य वर्णों को अनुमति दे सकता है। (जोर मेरा)

एक हाइफ़न उन वर्णों में सूचीबद्ध नहीं है, जिन्हें किसी भी स्थिति में अनुमति दी जानी चाहिए। इसलिए, यदि उनका उपयोग किया जाता है, तो पोर्टेबिलिटी की गारंटी नहीं होती है।

गोले के उदाहरण जो कि हाइफ़न का समर्थन नहीं करते हैं

dash/bin/shडिबियन-उबंटू परिवार पर डिफ़ॉल्ट शेल ( ) है और यह फ़ंक्शन नामों में हाइफ़न का समर्थन नहीं करता है:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

दिलचस्प रूप से पर्याप्त है, यह एलियंस में हायफ़न का समर्थन करता है , हालांकि, जैसा कि ऊपर उल्लेख किया गया है, यह एक कार्यान्वयन विशेषता है , आवश्यकता नहीं:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

फ़ॉरेस्टबॉक्स शेल (Almquist शेल) फ़ंक्शन नामों में हाइफ़न का समर्थन नहीं करता है:

$ a-b() { date; }
-sh: Syntax error: Bad function name

शेल द्वारा हाइफ़न समर्थन का सारांश

निम्नलिखित गोले फ़ंक्शन नामों में हाइफ़न का समर्थन करने के लिए जाने जाते हैं:

  • ksh, bash, zsh

निम्नलिखित गोले फ़ंक्शन नामों में हाइफ़न का समर्थन नहीं करने के लिए जाने जाते हैं :

  • राख (बिजीबॉक्स), csh, tsh, डैश

निष्कर्ष

  • हाइफ़न अमानक हैं। यदि आप क्रॉस-शेल संगतता चाहते हैं तो उनसे दूर रहें।
  • हाइफ़न के बजाय अंडरस्कोर का उपयोग करें: हर जगह अंडरस्कोर स्वीकार किए जाते हैं।

2
-उनके साथ नाम बुराई हैं। मैं तुम्हें देख रहा हूँ, सीएसएस। :)
PM 2Ring

धन्यवाद। मैं बाद में परीक्षण किया cshऔर tcshऔर वे या तो हाइफ़न का समर्थन नहीं करते, लेकिन कॉर्न खोल किया था। यह थोड़ा मज़ेदार है कि मैंने a-b()अपने फ़ंक्शन नाम के रूप में भी उपयोग किया।
iconoclast

@iconoclast मैंने आपके शेल परीक्षणों के परिणामों को उत्तर में जोड़ दिया। धन्यवाद।
जॉन 1024

@ PM2Ring वे अंडरस्कोर वाले नामों की तुलना में टाइप करना आसान है। सिस्टम की परंपरा या कार्यान्वयन निर्णयों को छोड़कर, जो उन्हें अनुमति नहीं देते हैं, आप इस सिद्धांत का समर्थन करने के लिए किस सिद्धांत को इंगित कर सकते हैं कि वे बुराई हैं?
iconoclast

1
हाइफ़न के साथ @iconoclast नाम कई भाषाओं में असंभव हैं, चूंकि हाइफ़न की व्याख्या माइनस साइन के रूप में की जाती है, इसलिए यदि ऐसी भाषा को किसी भाषा के साथ हस्तक्षेप करने की आवश्यकता होती है जो हाइफ़न के साथ नामों का समर्थन करती है तो आपको गड़बड़ स्थिति मिलती है: हाइफ़न किए गए नामों वाली इकाइयां मजबूर हो जाती हैं। दूसरी भाषा में एक अलग नाम है।
PM 2

3

मुझे पता है कि यह वास्तव में देर हो चुकी है, लेकिन शायद आप अंडरस्कोर को अधिक सुलभ बनाने के अपने मुद्दे के आसपास काम कर सकते हैं।

xmodmap -e "keycode  20 =  underscore minus"

यह हाइफ़न (माइनस) के साथ अंडरस्कोर को स्विच करेगा।

तो अब, आप हाइफ़न के लिए शिफ्ट रखते हैं, लेकिन एक अंडरस्कोर बिना शिफ़्ट के टाइप किया जाता है।

आपका कीकोड अलग हो सकता है, हालाँकि, मुझे लगता है कि यह आपके कीबोर्ड पर निर्भर करता है; खदान 20 की होती है। बस आपको यह बताने की जरूरत है कि आपको किस कीकोड का उपयोग करने की आवश्यकता है।

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