शेल वैध फ़ंक्शन नाम अक्षर


13

विस्तारित यूनिकोड वर्णों का उपयोग करना कई उपयोगकर्ताओं के लिए उपयोगी है (कोई संदेह नहीं है)।

सरल गोले (राख (बिजीबॉक्स), डैश) और ksh के साथ असफल:

tést() { echo 34; }

tést

लेकिन , , , और इसे अनुमति देते हैं।

मुझे पता है कि POSIX वैध फ़ंक्शन नाम नेम की इस परिभाषा का उपयोग करते हैं । इसका मतलब है कि यह रेगेक्स:

[a-zA-Z_][a-zA-Z0-9_]*

हालाँकि, पहले लिंक में यह भी कहा गया है:

एक कार्यान्वयन एक फ़ंक्शन नाम में अन्य वर्णों को विस्तार के रूप में अनुमति दे सकता है।

प्रश्न हैं:

  • क्या यह स्वीकृत और प्रलेखित है?
  • कहाँ पे?
  • किस गोले के लिए (यदि कोई हो)?

संबंधित प्रश्न:
शेल फ़ंक्शन नाम में इसके संभावित उपयोग विशेष वर्ण?
मैं फ़ंक्शन नामों में मेटा-वर्णों (>) का उपयोग करने में दिलचस्पी नहीं रखता हूं।

अपस्टार्ट और बैश फंक्शन नाम युक्त "-"
मुझे विश्वास नहीं है कि एक ऑपरेटर (घटाव "-") एक नाम का हिस्सा होना चाहिए।


आप aliasएक बालक और अधिक उदार हो सकता है। और इसलिए आप फ़ंक्शन को कुछ उचित, बटन-डाउन नाम के साथ लिख सकते हैं, और फिर फ़ंक्शन को कॉल करने के लिए बस एक और अधिक स्टाइलिश नाम से परिभाषित कर सकते हैं। में dashवहाँ भी कुछ सामान है आप के साथ क्या कर सकते हैं $PATHऔर %func
15

जवाबों:


16

चूंकि POSIX प्रलेखन इसे विस्तार के रूप में अनुमति देता है, इसलिए उस व्यवहार से कार्यान्वयन को रोकने के लिए कुछ भी नहीं है।

एक साधारण जांच (में भाग गया zsh):

$ for shell in /bin/*sh 'busybox sh'; do
    printf '[%s]\n' $shell
    $=shell -c 'á() { :; }'
  done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name

पता चलता है कि bash, zsh, yash, ksh93(जो kshअपने सिस्टम में से जुड़ा हुआ), pdkshऔर उसके व्युत्पत्ति समारोह नाम के रूप में बहु बाइट वर्णों की अनुमति।

yash शुरू से ही मल्टीबैट पात्रों का समर्थन करने के लिए डिज़ाइन किया गया है , इसलिए इसमें कोई आश्चर्य की बात नहीं है कि यह काम किया है।

आपके द्वारा उल्लेखित अन्य दस्तावेज हैं ksh93:

एक रिक्त एक टैब या एक स्थान है। एक पहचानकर्ता अक्षरों, अंकों या अंडरस्कोर का एक अनुक्रम होता है जो एक पत्र या अंडरस्कोर से शुरू होता है। पहचानकर्ता का उपयोग चर नामों के घटकों के रूप में किया जाता है। एक vname एक या एक से अधिक पहचानकर्ता का अनुक्रम है जिसे a द्वारा अलग किया जाता है। और वैकल्पिक रूप से एक से पहले .. Vnames फ़ंक्शन और चर नामों के रूप में उपयोग किया जाता है। एक शब्द गैर-उद्धृत मेटाचैकर्स को छोड़कर वर्तमान लोकेल द्वारा निर्धारित वर्ण से वर्णों का एक क्रम है ।

तो Cलोकेल पर सेट करना :

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

इसे विफल करो।


poshऐसी सूची में सूचीबद्ध होने के लायक नहीं है। यह लिनक्स विशिष्ट बग पर निर्भर करता है libcऔर अन्य प्लेटफार्मों पर काम नहीं करेगा।
विद्वान

मैं ksh93मूल स्रोतों से स्वयं संकलित ksh93 का उपयोग करने के बारे में आपके दावे को नहीं दोहरा सकता । जबकि ksh88समारोह नाम के लिए गैर-7-बिट-ASCII अक्षरों स्वीकार करने के लिए लगता है, केवल ksh93उबंटू से बाइनरी उन्हें स्वीकार करने लगता है।
8

@ स्किली ksh मैं इस परीक्षण में इस्तेमाल किया डेबियन में द्विआधारी है (तो यह उबंटू पर एक के साथ एक ही हो सकता है)
congonglm

9

ध्यान दें कि फ़ंक्शंस फ़ाइल सिस्टम में कमांड सहित अन्य कमांडों के समान फ़ंक्शंस साझा करते हैं, जो कि अधिकांश सिस्टम में वर्णों पर कोई सीमा नहीं है या यहां तक ​​कि बाइट्स भी हो सकते हैं जो उनके पथ में हो सकते हैं।

इसलिए जब अधिकांश गोले अपने कार्यों के पात्रों को प्रतिबंधित करते हैं, तो कोई वास्तविक अच्छा कारण नहीं है कि वे ऐसा क्यों करेंगे। इसका मतलब है कि उन गोले में, ऐसे कमांड हैं जिन्हें आप किसी फ़ंक्शन से बदल नहीं सकते हैं।

zshऔर rcकुछ के साथ /और खाली स्ट्रिंग सहित उनके फ़ंक्शन नामों के लिए कुछ भी अनुमति दें । zshयहां तक ​​कि एनयूएल बाइट्स की अनुमति देता है।

$ zsh
$ $'\0'() echo nul
$ ^@
nul
$ ""() uname
$ ''
Linux
$ /bin/ls() echo test
$ /bin/ls
test

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

यहां सुरक्षा संबंधी समस्या नहीं है क्योंकि आप (स्क्रिप्ट लेखक) जो फ़ंक्शन परिभाषित करते हैं वे आपके द्वारा किए गए हैं ।

जहाँ सुरक्षा के मुद्दे हो सकते हैं, जब पार्सिंग पर्यावरण से प्रभावित होती है, उदाहरण के लिए ऐसे गोले, जहाँ कार्यों के लिए मान्य नाम लोकेल से प्रभावित होते हैं।


एक पार्टी में खेल भी खेल सकते हैं, के साथ शुरू function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }उपयोगी चीजें भी नामित कार्यों के साथ, और संभवतः --, //, @या %आदि
mr.spuratic

लेकिन नॉट शेल एक हैश-टेबल लुक को बाईपास करते हैं जब /एक नाम में पाया जाता है? और एक फ़ंक्शन सिर्फ एक निष्पादन योग्य नाम नहीं है - इसका कोड। मुझे लगता है कि एक साधारण क्रियान्वयन से कई बड़ी समस्याओं का सामना किया जा सकता है यदि इसके संग्रहित फ़ंक्शन नामों में मेटाचैकर्स शामिल हैं।
15

हां, मैं var में nulls को शामिल करने के लिए bash की अक्षमता से अवगत हूं, जो कि फ़ंक्शन नामों के लिए यथोचित रूप से बढ़ाया जा सकता है। मेरे पास कोई विशिष्ट उदाहरण नहीं है, लेकिन मुझे लगता है कि नामों के लिए लगभग कुछ भी अनुमति देने का यह खेल "काम करने का आसान तरीका" की तुलना में संभावित सुरक्षा उल्लंघन से अधिक है। मुझे उम्मीद है कि मैं गलत हूं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.