कमांड और उनके विकल्पों के तर्कों के रूप में एन्कोडिंग ब्रेसेस {} का उपयोग


11

उदाहरण

मैंने हाल ही में एन्कोडिंग ब्रेसिज़ के जोड़े का उपयोग करने के उदाहरणों को पाया है {}, जो खुलने और बंद होने वाले ब्रेसिज़ के बीच कुछ भी नहीं है, कमांड के तर्क के रूप में और यहां तक ​​कि उनके विकल्पों के लिए भी:

cat foo | xargs -I{} echo {}

find . -size 0 -exec rm -i {} \;

कोई दस्तावेज नहीं

मेरी समस्या यह है कि मुझे ग्नू बैश मैनुअल में कोई दस्तावेज नहीं मिला है जो {}ऊपर दिए गए उदाहरणों में इस तरह के संदर्भ के उपयोग का वर्णन करता है।

मुझे नहीं लगता कि यह एक पैरामीटर विस्तार है , क्योंकि एक डॉलर के संकेत को पैरामीटर विस्तार में संलग्नक ब्रेसिज़ से पहले होना चाहिए ${}

यह ब्रेस एक्सपेंशन भी नहीं हो सकता है , क्योंकि यह इसका रूप लेता है {x..y[..incr]}, जहां xऔर yवैकल्पिक नहीं हैं।

यह कमांड कमांडिंग भी नहीं हो सकता है , क्योंकि {}इसका उपयोग तर्कों के रूप में किया जाता है।

प्रशन

  1. संलग्नक ब्रेसिज़ की एक जोड़ी का क्या {}मतलब है, सामान्य तौर पर, किसी भी आदेश के तर्क के रूप में जो इसे स्वीकार करता है?

  2. मुझे एक दस्तावेज कहां मिल सकता है जो {}तर्कों के उपयोग का वर्णन करता है?


कुछ कमांड्स में यह विकल्प होता है {}- कमांड के targetsसाथ कार्य करने का अर्थ है find, यह rmफाइल को हटा / पाया गया है।
तुईन फाम

जवाबों:


16

इन घुंघराले ब्रेस को बैश करके अकेला छोड़ दिया जाता है; वे संबंध रखते हैं findऔर xargsक्रमश: और उनके आदमी पृष्ठों में वर्णित हैं।

man find

-exec आदेश ;

निष्पादित आदेश ; सच है अगर 0 स्थिति वापस आ गई है। खोजने के लिए निम्नलिखित सभी तर्कों को कमांड में तर्क दिया जाता है जब तक कि एक तर्क ;का सामना नहीं करना पड़ता है। स्ट्रिंग {}को वर्तमान फ़ाइल नाम से प्रतिस्थापित किया जा रहा है, इसे हर जगह संसाधित किया जा रहा है जो कमांड के तर्कों में होता है, न कि केवल उन तर्कों में जहां यह अकेला है, जैसा कि कुछ संस्करणों में है find। इन दोनों निर्माणों \को शेल द्वारा विस्तार से बचाने के लिए (ए ) के साथ भाग जाने या उद्धृत करने की आवश्यकता हो सकती है । -execविकल्प के उपयोग के उदाहरणों के लिए परीक्षा अनुभाग देखें । निर्दिष्ट आदेशप्रत्येक मिलान की गई फ़ाइल के लिए एक बार चलाया जाता है। कमांड को प्रारंभिक निर्देशिका में निष्पादित किया जाता है। -exec कार्रवाई के उपयोग के आसपास अपरिहार्य सुरक्षा समस्याएं हैं ; आपको -execdirइसके बजाय विकल्प का उपयोग करना चाहिए ।

-exec आदेश {} +

-execकार्रवाई का यह संस्करण चयनित फ़ाइलों पर निर्दिष्ट कमांड चलाता है , लेकिन अंत में प्रत्येक चयनित फ़ाइल नाम को जोड़कर कमांड लाइन का निर्माण किया जाता है; कमांड की कुल संख्या का मिलान की गई फ़ाइलों की संख्या से बहुत कम होगा। कमांड लाइन को उसी तरीके से बनाया गया है जो xargsअपनी कमांड लाइनों को बनाता है। {}कमांड के भीतर केवल एक उदाहरण की अनुमति है। कमांड को प्रारंभिक निर्देशिका में निष्पादित किया जाता है। यदि findकिसी त्रुटि का सामना करता है, तो यह कभी-कभी तत्काल बाहर निकलने का कारण बन सकता है, इसलिए कुछ लंबित आदेशों को बिल्कुल भी नहीं चलाया जा सकता है। यह वेरिएंट -execहमेशा सही रहता है।

-execdir आदेश ;

-execdir आदेश {} +

जैसे -exec, लेकिन निर्दिष्ट कमांड उपनिर्देशिका से मेल खाते फ़ाइल से चलाया जाता है, जो सामान्य रूप से वह निर्देशिका नहीं है जिसमें आपने ढूंढना शुरू किया था। यह कमांडिंग चालान के लिए एक अधिक सुरक्षित तरीका है, क्योंकि यह मिलान की गई फ़ाइलों के लिए पथों के समाधान के दौरान दौड़ की स्थिति से बचा जाता है। साथ के रूप में -exec कार्रवाई, + के रूप -execdir एक से मेल खाता फ़ाइल की तुलना में अधिक की प्रक्रिया के लिए एक कमांड लाइन का निर्माण होगा, लेकिन आदेश के किसी भी आह्वान है कि एक ही उप-निर्देशिका में मौजूद केवल सूची फ़ाइलें होगा। यदि आप इस विकल्प का उपयोग करते हैं, तो आपको यह सुनिश्चित करना होगा कि आपका $PATHपर्यावरण चर संदर्भ नहीं देता है.; अन्यथा, एक हमलावर किसी भी कमांड को चला सकता है जिसे वे एक निर्देशिका में उचित रूप से नामित फ़ाइल को छोड़ कर पसंद करते हैं जिसमें आप चलेंगे -execdir। यह उन प्रविष्टियों पर लागू होता है $PATHजिनमें रिक्त हैं या जो पूर्ण निर्देशिका नाम नहीं हैं। यदि findकिसी त्रुटि का सामना करता है, तो यह कभी-कभी तत्काल बाहर निकलने का कारण बन सकता है, इसलिए कुछ लंबित आदेशों को बिल्कुल भी नहीं चलाया जा सकता है। कार्रवाई का परिणाम इस बात पर निर्भर करता है कि +या ;संस्करण का उपयोग किया जा रहा है; -execdir आदेश {} + हमेशा सच देता है, जबकि -execdir आदेश {} ; केवल तभी सच रिटर्न आदेश रिटर्न 0।

man xargs

-I की जगह-str

मानक इनपुट से पढ़े गए नामों के साथ प्रारंभिक-तर्कों में प्रतिस्थापित- आवृत्तियों की घटनाओं को बदलें । इसके अलावा, निर्विवाद रिक्तियां इनपुट आइटम को समाप्त नहीं करती हैं; इसके बजाय विभाजक newline वर्ण है। इंप्लाइज -xऔर -L 1

-i[ प्रतिस्थापित-str ], --replace[ =प्रतिस्थापित-str ]

यह विकल्प -Iप्रतिस्थापित-str के लिए एक पर्याय है यदि प्रतिस्थापित-str निर्दिष्ट है। यदि प्रतिस्‍पर्धात्‍मक तर्क गायब है, तो प्रभाव जैसा है -I{}। यह विकल्प हटा दिया गया है; -Iइसके बजाय उपयोग करें ।

संपादित करें: और यहाँ क्यों बैश उन घुंघराले ब्रेसिज़ की उपेक्षा करता है:

man bash

{ सूची; }

सूची को केवल वर्तमान शेल वातावरण में निष्पादित किया जाता है। सूची को एक नई पंक्ति या अर्धविराम के साथ समाप्त किया जाना चाहिए। इसे एक ग्रुप कमांड के रूप में जाना जाता है। वापसी की स्थिति सूची की निकास स्थिति है। ध्यान दें कि मेटाचैकर ( और ) के विपरीत , { और } आरक्षित शब्द हैं और वहां होना चाहिए जहां एक आरक्षित शब्द को मान्यता दी जाए। चूंकि वे एक शब्द विराम का कारण नहीं बनते हैं, उन्हें सूची से व्हॉट्सएप या किसी अन्य शेल मेटाचैकर द्वारा अलग किया जाना चाहिए।

जोर देने के लिए: सूची को एक नई पंक्ति या अर्धविराम के साथ समाप्त किया जाना चाहिए


1
धन्यवाद! मैं इस बात से नाराज़ हूं कि जिसने भी लिखा, man xargsउसे समझाने का कोई {}मतलब नहीं था कि न तो लेखक ने रीडायरेक्ट किया (न ही कोई इरादा था) पाठक को -execमैन-पेज के स्पष्टीकरण के लिए भेजा find
निको गम्बट

@ NikoGambt - मुझे सहानुभूति है ...
tink

5
@NikoGambt ठीक है, {} वास्तव में xargs के लिए कुछ भी मतलब नहीं है, -i के लिए डिफ़ॉल्ट मान को छोड़कर, जिसे हटा दिया गया है। मुझे यकीन नहीं है कि इससे आगे क्या स्पष्टीकरण आवश्यक है। आपके द्वारा पोस्ट किए गए उदाहरण में, यह हो सकता है xargs -Iab echo ab; यह पूरी तरह से मनमाना विकल्प है।
रैंडम 32३२

@ Random832 के साथ कुछ और परीक्षण करने के बाद -I, अब मैं समझता हूं कि वास्तव में वह विकल्प क्या है। हां, {}मनमाना है, जैसा आपने कहा। मैं सिर्फ स्पष्टीकरण से उलझन में था If the replace-str argument is missing, the effect is the same as -I{}। यदि -Iबिना तर्क के समान था -I{}, तो cat foo | xargs -I echo {}चल रहे परिणाम के समान होगा cat foo | xargs -I{} echo {}। हालांकि, वे समान नहीं हैं। पूर्व एक त्रुटि है, और जो मुझे और भी भ्रमित करता है वह त्रुटि संदेश था xargs: {}: No such file or directory, लेकिन यह सिर्फ कार्यान्वयन के कारण है।
निको गम्बट

1
@NikoGambt -I(अपरकेस I) बिना तर्क के नहीं चलाया जा सकता। का तर्क -Iथा echo। यह -Iऔर -i(और कारण के बीच का प्राथमिक अंतर है), क्योंकि गैर-आवश्यक तर्कों के साथ विकल्प असामान्य और भ्रामक हैं)
random832
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.