कौन स्टार के साथ * गूंज * में व्यवहार करता है


15

कौन सौदा करता है (व्याख्या) * में

echo *

क्या प्रतिध्वनि तारा देखती है या शेल इसके बारे में ध्यान रखता है और फ़ाइल नाम की सूची वापस करता है ..

व्हाट अबाउट

cp temp temp*

14
ये बदलता रहता है। यूनिक्स के गोले या विंडोज के गोले?
user1686

@ शुद्धता एकता के गोले खेद है कि मैंने इसका उल्लेख नहीं किया।
फारसॉफ्ट

यूनिक्स के लिए, नीचे दिए गए उत्तर सही हैं। (विंडोज पर, यह व्यक्तिगत कार्यक्रमों द्वारा किया जाता है - हालांकि आमतौर पर मुख्य से पहले रनटाइम लाइब्रेरी द्वारा स्वचालित रूप से) ()।
user1686

जवाबों:


24

बैश (या जो भी आप शेल के रूप में उपयोग करें), किसी भी इनपुट को पढ़ने के लिए पहली बात यह है, और विशेष वर्ण जैसे की व्याख्या शुरू कर देंगे ?और *CWD* में जो भी मैच होते हैं, उनका विस्तार होता है , जिसका अर्थ है कि तारांकन को उक्त मैचों द्वारा प्रतिस्थापित किया जाता है।

ज्यादातर मामलों में, यह काफी हद तक आगे है, लेकिन समय-समय पर कुछ भ्रामक मामलों को जन्म दे सकता है।

निम्नलिखित को धयान मे रखते हुए। एक निर्देशिका में यह सामग्री है:

  • परीक्षण (नियमित फ़ाइल)
  • test1 (निर्देशिका)
  • test2 (निर्देशिका)
  • test3 (निर्देशिका)

यदि आप तब mv *कुछ अजीब लगता है टाइप करें : test3वहाँ है, लेकिन बाकी चला गया है। पहली बार में अजीब होते हुए, यह समझ में आता है कि एक बार आप समझ जाते हैं कि वास्तव में क्या बैश होता है mv। तारांकन के कारण, bash व्याख्या mv *करता है mv test test1 test2 test3, और जब mv को वह सूची मिलती है, तो यह मान लेगा कि अंतिम तर्क गंतव्य है, जो कि सभी फ़ाइलों को स्थानांतरित कर दिया गया है।

आपके द्वारा सूचीबद्ध आदेशों के लिए:

  • echo *एक गरीब-आदमी के रूप में कार्य कर सकता है ls। शेल उस निर्देशिका में जो कुछ भी है उसमें तारांकन का विस्तार करेगा, और जैसा कि मुझे यकीन है कि आप पहले से ही जानते हैं, echoशाब्दिक रूप से तर्क के रूप में इसे पारित करने के लिए कुछ भी बैश कर सकते हैं।
  • cp temp temp*mvऊपर बताई गई कमांड के अनुसार कुछ हद तक व्यवहार करेंगे , जब तक कि अस्थायी नाम की केवल एक निर्देशिका न हो, जिसमें स्रोत और गंतव्य का नाम समान है, अर्थात यह कुछ नहीं करेगा।

8
*इसके बजाय उपयोग करने के बारे में "गरीब" कुछ भी नहीं है ls। उदाहरण के लिए, यदि फाइलनाम में व्हॉट्सएप या ग्लोब कैरेक्टर होता for f in *; doहै , तो यह अधिक विश्वसनीय है for f in $(ls)। (हालांकि, अगर CWD में कोई फाइल नहीं है, तो यह विफल हो जाएगा, इसलिए आपको उस मामले की जांच करने की आवश्यकता है।)
1

1
@rici यही तो shopt nullglobहै।
एक CVn

3
के रूप में echo *, कि चाल कुछ मामलों में आप को बचा सकता है
एक CVn

2
साथ में चिमटा: अवांछनीय स्विच को ट्रिगर करने वाले मनमाने फ़ोल्डरों में "-" के साथ तैयार की गई फाइलें। जब तक आपको लगता है कि rm ./-stupidfile काम नहीं करता, तब तक उन्हें हटाना ज्यादा मजेदार नहीं है।
.bρǝɲǝɲ

1
@ deletebρǝɲǝɲ मैंने देखा जब मुझे एक बार एक निर्देशिका की सामग्री को हटाने की जरूरत थी, जिसमें एक समन्वय प्रणाली में फ़ाइल नाम प्रतिनिधित्व पदों के साथ फाइलें थीं, -1024x-1024 से 1024x1024 तक। जब मैंने पहली बार भागने के बारे में सीखा।
जरमुंड

5

जैसा कि पहले ही कहा गया है, शेल का विस्तार *इसलिए echoहै क्योंकि वर्तमान निर्देशिका में शेल जो भी तर्क देता है। हालाँकि, ध्यान दें कि यदि विस्तार से कुछ भी नहीं होता है, तो उस स्थिति में यदि निर्देशिका में कोई ग़ैर-छिपी हुई फ़ाइलें नहीं हैं, तो *अपरिवर्तित छोड़ दिया जाता है और जैसा कि कमांड को कहा जाता है (जब तक कि कुछ गोले जैसे गैर मानक विकल्पों का उपयोग नहीं किया जाता है bash)। echo *इसके बाद गरीब आदमी की तरह व्यवहार lsनहीं किया जाएगा क्योंकि पूर्व में कुछ भी नहीं छपेगा जबकि बाद में प्रिंट होगा *

इसी तरह, वर्तमान निर्देशिका में cp /tmp/temp temp*नाम से एक फ़ाइल बनाएंगे temp*यदि कम से कम एक फ़ाइल नहीं है जो नाम से शुरू होती है temp

अंत में, यदि आप चाहते हैं कि *जो भी मामला हो, उसे अपरिवर्तित किया जाए , तो आप एकल उद्धरण '*', दोहरे उद्धरण "*"या बैकलैश का उपयोग करके इसे विस्तार से बचा सकते हैं \*


4

बैश में, शेल इसके साथ संबंधित है। आप देखते हैं कि यदि आप भी *बिना प्रतिध्वनि के प्रयास करते हैं

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

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

तो ls *थोड़ा क्लिच है

विंडोज में, *कमांड द्वारा नियंत्रित किया जाता है, इसलिए dir *.*क्लिच नहीं है।

नोट- कुछ टिप्पणियों को देखकर, मैं जोड़ूंगा, एक जोखिम चल रहा है * फिर ENTER। यदि आपके पास एक फ़ाइल है जिसे rm कहा जाता है जो कि डायरेक्टरी लिस्टिंग में पहले स्थान पर है, तो यह खतरनाक है क्योंकि इसके हटने के बाद कुछ भी हो सकता है। इसके अलावा, और यह कम संभावना नहीं है, अगर निर्देशिका लिस्टिंग में पहली फ़ाइल पथ में एक स्क्रिप्ट का नाम है, तो वह इसे चलाएगा।


4
ध्यान दें कि एक फ़ाइल हो सकती है rm, जिसका नाम बेशक है।
वोल्कर सीगल

1
... और एक अन्य ने कहा
-rf

1
@ filbρǝɲǝɲ क्या आपके पास कोई फ़ाइल हो सकती है जिसका फ़ाइल नाम है -rf? मैंने कोशिश की touch -rfऔर touch \-rfवह इसे नहीं बना रहा है।
बार्लॉप

@barlop मैंने ऊपर टिप्पणी की; gui (जैसे gedit) उन्हें ठीक से संभालता है, लेकिन चूंकि शेल (कम से कम bash) इसके माध्यम से गुजरता है। क्या आपको कभी गलती से ऐसी फाइल बनानी चाहिए, आरएम संकेत देने की कोशिश करता है, लेकिन अगर ऐसा नहीं होता है: मुझे उम्मीद है कि यह केवल डिस्पोजेबल बच्चों के साथ एक अस्थायी फ़ोल्डर में समाप्त होता है।
.bρǝɲǝɲ

@ allbρǝɲǝɲ मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है, मैं पूछ रहा हूं कि आप एक फाइल कैसे बना सकते हैं जिसका नाम है -rf? (मैं rm नामक एक फ़ाइल और -rf नामक एक फ़ाइल के खतरे को समझता हूं, और टाइपिंग की समस्या * और एक महत्वपूर्ण फ़ोल्डर में प्रवेश करने के लिए, मुझे ऐसा करने की योजना नहीं है)
बार्लोप

-1

कमांड को तर्क सौंपने से पहले शेल कई विस्तार करता है ।

यह भी देखें https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command.Expansion

बैश-विशिष्ट नहीं, http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 देखें


तकनीकी रूप से आप जो लिख रहे हैं वह सही है, लेकिन लिंक के बिना, यह जवाब वास्तव में सवाल का जवाब देने के लिए कुछ भी नहीं करता है। प्रासंगिक विवरणों को शामिल करने पर विचार करें।
एक CVn

@ माइकलकॉर्जलिंग मैं लिंक के बारे में बात से सहमत हूं, लेकिन ओपी ने बस पूछा कि क्या शेल या कमांड ने खुद ही तर्क को संभाला है। ग्लेन का उत्तर केवल यह बताता है कि शेल उन्हें संभालता है, इसलिए यह प्रश्न का स्वीकार्य उत्तर है।
slhck

@slhck यही कारण है कि मैं NAA के रूप में झंडा नहीं था: वहाँ कुछ छोड़ दिया है जो लिंक को अलग करने के बाद सवाल को संबोधित करता है। इसका मतलब यह नहीं है कि यह मेरी राय में अच्छा जवाब है। (अब मैं देख रहा हूं कि मेरी प्रारंभिक टिप्पणी को अन्यथा माना जा सकता है; इसके लिए, मैं माफी चाहता हूं, लेकिन मुझे अभी भी लगता है कि इसे छोड़ने के लिए पर्याप्त मूल्य है जहां यह है।)
15:14 पर एक CVn

@ माइकलकॉर्जिंग सहमत। मैं तो बस जो लोग के लिए टिप्पणी की है किया NAA के रूप में (और होगा) यह झंडा।
slhck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.