शेल वाइल्डकार्ड वर्ण विस्तार रोकें?


88

क्या बाश या csh को बताने के लिए संकलित कमांड-लाइन प्रोग्राम का कोई तरीका है कि वह नहीं चाहता है कि उसके मापदंडों में कोई वाइल्डकार्ड वर्ण विस्तारित हो?

उदाहरण के लिए, किसी को शेल कमांड चाहिए:

foo *

बस उस वर्ण के संख्यात्मक ASCII मान को वापस करने के लिए।

जवाबों:


119

नहीं। कमांड वास्तव में चलने से पहले विस्तार होता है।
आप केवल कमांड चलाने से पहले या स्टार को उद्धृत करके ग्लोब को निष्क्रिय कर सकते हैं।

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *

$ # alternative to set -f
$ set -o noglob
$ # undo it by 
$ set +o noglob

3
इसके अलावा, अगर विस्तार करने के लिए कुछ नहीं है, तो कोई विस्तार नहीं है। एक खाली के साथ pwd, echo *बस है*
सैम boosalis

7
@sam यह वास्तव में इस बात पर निर्भर करता है कि आपके विकल्प कैसे सेट किए जाते हैं। Tldp से: "यदि कोई मिलान फ़ाइल नाम नहीं मिलता है, और शेल विकल्प nullglobअक्षम है, तो शब्द अपरिवर्तित रह जाता है। यदि nullglobविकल्प सेट है, और कोई मिलान नहीं मिला है, तो शब्द हटा दिया गया है।"
क्रिस मिडलटन

धन्यवाद, मुझे योग्य होना चाहिए कि यह केवल अवलोकन से था किसी भी समझ से नहीं।
सैम बोसालिस

@ c00kiemon5ter पूर्ववत कैसे करें set -f? क्या यह है unset -f?
नाम जी वीयू

1
@NamGVUset +f
Yngvar Kristiansen

62

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

श, बश और क्ष शैल के लिए:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}

Csh और tcsh गोले के लिए:

alias foo 'set noglob;\foo \!*;unset noglob'

Zsh शेल के लिए:

alias foo='noglob foo'

कमांड पथ का उपयोग करने की आवश्यकता नहीं है। मान लें कि कमांड फू को निर्देशिका में संग्रहीत किया जाता है ~ / बिन, तो ऊपर बन जाएगा:

श, बश और क्ष शैल के लिए:

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

Csh और tcsh गोले के लिए:

alias foo 'set noglob;$home/bin/foo \!*;unset noglob'

Zsh शेल के लिए:

alias foo='noglob ~/bin/foo'

उपरोक्त सभी को Apple के OSX 10.9.2 का उपयोग करके परीक्षण किया गया था। नोट: उपरोक्त कोड को कॉपी करते समय, किसी भी स्थान को हटाने के बारे में सावधान रहें। वे महत्वपूर्ण हो सकते हैं।

अपडेट करें:

उपयोगकर्ता जियरा ने बताया है कि एक बैश शेल के मामले में

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

के साथ प्रतिस्थापित किया जा सकता है

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

जो फ़ंक्शन फू की आवश्यकता को समाप्त करता है।

इस दस्तावेज़ को बनाने के लिए उपयोग की जाने वाली कुछ वेब साइटें:


3
यह स्वीकृत जवाब होना चाहिए था क्योंकि यह साबित करता है कि ओपी क्या चाहता है यह वास्तव में संभव है। बैश में कुछ और भी बेहतर तरीकों के लिए, यह लिंक विभिन्न विकल्पों को दस्तावेज़ित करता है: blog.edwards-research.com/2011/05/preventing-globbing
geira

@geira: कभी-कभी बेहतर उत्तर पोस्ट करने से पहले एक उत्तर स्वीकार कर लिया जाता है। मेरा मानना ​​है कि यह उन मामलों में से एक हो सकता है। मैं यह भी मानता हूं कि उपयोगकर्ताओं द्वारा सबसे उपयोगी के रूप में उत्तर के निशान पहले समाप्त होते हैं। नोट: मैंने आपके इनपुट को मेरे उत्तर में जोड़ दिया।
डेविड एंडरसन

@geira, ओपी शेल को संवाद करने के लिए संकलित कार्यक्रम चाहता है; यह उत्तर देना कि कमांड-बाय-कमांड के आधार पर वांछित व्यवहार करने के लिए शेल को कॉन्फ़िगर करना संभव है, एक उपयोगी उत्तर है, और मैं खुद इस बात को स्वीकार करूंगा, लेकिन मैं इस बात से असहमत हूं कि क्या यह पूरी तरह से ऑन-पॉइंट है।
चार्ल्स डफी

तथ्य यह है कि यह किया जा सकता है इसका मतलब यह नहीं है कि यह किया जाना चाहिए। चुनिंदा आदेशों के लिए उपयोगकर्ता की उचित अपेक्षा से शेल का व्यवहार बदलना आश्चर्यजनक और अंततः अवांछनीय लगता है।
ट्रिपल जूल

@tripleee: एक समय था जब लोग रिले और वैक्यूम ट्यूब की उम्मीद करते थे। उम्मीद थी कि कार्डबोर्ड कार्ड और पेपर टेप में छेद किए गए थे। लोगों ने कैलकुलेटर और फोन के बजाय स्लाइड नियम बनाए। मुझे लगता है कि यह आपके लिए वांछनीय होगा। मैंने उन समय की ज्यादा परवाह नहीं की। मुझे यह देखकर मजा आता है कि आगे क्या है।
डेविड एंडरसन

8

आपके प्रोग्राम को चलाने से पहले शेल द्वारा विस्तार का प्रदर्शन किया जाता है। आपके कार्यक्रम का कोई सुराग नहीं है कि क्या विस्तार हुआ है या नहीं।

   set -o noglob

इनवोकिंग शेल में विस्तार बंद कर देगा, लेकिन आपको अपना कार्यक्रम शुरू करने से पहले ऐसा करना होगा ।

विकल्प के लिए अपने तर्कों को उद्धृत करना है

foo "*"

4
सेटटॉप zsh- विशिष्ट कमांड प्रतीत होता है। जैसा कि एक अन्य पोस्टर में कहा गया है, बैश के लिए आप set -o noglobवाइल्डकार्ड विस्तार को अक्षम करने के लिए उपयोग करते हैं।
विरान पुराविंतो

अब संशोधित किया गया। धन्यवाद
ब्रायन एग्न्यू

1

खबरदार: यदि मास्क से मेल खाते कोई नाम नहीं हैं, तो बैश तर्क को पास कर देता है, जैसे कि विस्तार के बिना!

प्रूफ (pa.py एक बहुत ही सरल स्क्रिप्ट है, जो सिर्फ अपने तर्कों को छापती है):

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']

3
हर बार नहीं। set -o nullglobया shopt -s failglob, और यह व्यवहार बदल जाएगा (दो बहुत अलग तरीकों से)।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.