"Xargs" और कमांड प्रतिस्थापन के बीच अंतर?


14

कई मामलों में मैं इसके स्थान पर कमांड प्रतिस्थापन का उपयोग करता हूं xargs। उदाहरण के लिए के rm $(ls)रूप में ही हैls | xargs rm

वास्तव में उनके बीच अंतर क्या हैं?

मुझे लगता है कि मतभेदों में से एक यह है कि कमांड प्रतिस्थापन सब- xargsशेल में चलता है जबकि वर्तमान शेल में चलता है लेकिन मुझे यकीन नहीं है।

कृपया मतभेदों को सूचीबद्ध करें।

जवाबों:


9

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

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

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

आप इस मुद्दे पर एक अच्छी चर्चा पा सकते हैं: http://mywiki.wooledge.org/ParsingLs

सही सिंटैक्स होगा

echo rm *

या यदि आप xargs का उपयोग करना चाहिए,

find . -maxdepth 1 -print0 | xargs -0 echo rm

echoआउटपुट सही लगने पर निकालें ।


1
@ सिनोश: xargsपाइप के कारण भी एक सब-रन में चलता है, जब तक आप सक्षम नहीं करते हैं shopt -s lastpipe, इस स्थिति में यह चालू शेल में चलेगा। मुझे नहीं लगता कि इस मामले में हालांकि, सब-रनिंग एक समस्या है, क्योंकि आप किसी भी चर को नहीं बदल रहे हैं।
user000001

1
@ सिनोश: तर्कों को एक-एक करके पास करने के लिए, आप -lध्वज का उपयोग कर सकते हैं , जैसे find . -maxdepth 1 -print0 | xargs -0 -l rm। दूसरा सवाल के लिए, आप उपयोग नहीं कर सकते lsके साथ xargs -0क्योंकि ls अशक्त bute पर उत्पादन विभाजित नहीं है, लेकिन नई-पंक्तियों (जो BTW फ़ाइल नाम में मान्य हैं) के साथ
user000001

1
@ साइनो: पहला पैराग्राफ नहीं, लेकिन दूसरा एक: -0विकल्प के बिना xargs व्हाट्सएप मुद्दे से ग्रस्त है।
user000001

1
पढ़ें man xargs, echoपरीक्षण के लिए उपयोग करें , नहीं rmxargsहमें शेल सीमाएँ पार करने देता है (कुछ बफर 65K तक सीमित है, फ़ाइल नाम की सूची नहीं है)।
वाल्टिनेटर

1
@ सिनोश: मेरे पास एक अच्छा संदर्भ नहीं है, लेकिन आप टाइप कर सकते हैं xargs --show-limitsऔर आपको वह सीमा दिखाई देगी जो आपके सिस्टम पर सेट है,
user000001
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.