क्यों `सॉर्ट <" $ f1 "` को 'सॉर्ट - "$ f1" पर पसंद किया जाता है, और यह' सॉर्ट "$ f1" पर क्यों पसंद किया जाता है?


29

से /unix//a/458074/674

-- जब आदेशों को मनमाना तर्क पारित करना हो (या जहां संभव हो पुनर्निर्देशन का उपयोग करें) का उपयोग करना याद रखें । इसलिए sort -- "$f1"या sort < "$f1"इसके बजाय बेहतर sort "$f1"

इसे उपयोग करना --और पुनर्निर्देशन क्यों पसंद किया जाता है?

क्यों sort < "$f1"पसंद किया जाता है sort -- "$f1"?

क्यों sort -- "$f1"पसंद किया जाता है sort "$f1"?

धन्यवाद।


जवाबों:


55
sort "$f1"

उन मूल्यों के लिए विफल रहता है $f1जिनके साथ शुरू होता है -या sortकुछ के मामले के लिए यहां से शुरू होता है +( -o/etc/passwdउदाहरण के लिए नामक फ़ाइल के लिए गंभीर परिणाम हो सकते हैं )।

sort -- "$f1"

(जहां -- विकल्पों के अंत का संकेत होता है) उन मुद्दों के अधिकांश को संबोधित करता है लेकिन फिर भी फाइल के लिए विफल रहता है -(जो sortइसके बजाय इसके स्टड के रूप में व्याख्या करता है)।

sort < "$f1"

उन मुद्दों नहीं है।

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

और में

sort < "$f1" > out

(इसके विपरीत sort -- "$f1" > out), यदि "$f1"नहीं खोला जा सकता है, outतो नहीं बनाया जाएगा / काट दिया जाएगा और sortचलाया भी नहीं जाएगा ।

कुछ संभावित भ्रम (नीचे दी गई टिप्पणियों के बाद) को साफ़ करने के लिए, जो कमांड mmap()को फ़ाइल से आईएनजी को रोकने या उसके lseek()अंदर प्रवेश नहीं sortकरता है (ऐसा नहीं करता है) बशर्ते कि फ़ाइल स्वयं ही खोजी हो। अंतर केवल इतना है कि फ़ाइल पहले खोल दी जाती है और शेल के द्वारा फाइल डिस्क्रिप्टर 0 के रूप में शेल द्वारा बाद में संभवतः एक अलग फाइल डिस्क्रिप्टर पर विरोध किया जाता है। आदेश अभी भी / mmap कि fd 0 की तलाश कर सकता है क्योंकि यह प्रसन्न है। यह भ्रमित होने की बात नहीं है cat file | cmdकि इस समय cmdका स्टेपन एक पाइप है जिसे mmaped / तलाश नहीं किया जा सकता है।


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

7
@styrofoamfly: यह सही है जो less <fileसभी फ़ाइल को स्मृति में रखता है, लेकिन यह मजबूर नहीं है, यह कम की कमी है। के लिए ही cat file | lessमजबूर है। बाहर की जाँच करें less /dev/fd/0 <f, जो फ़ाइल को स्मृति में नहीं रखता है, भले ही यह इसे स्टडिन पर प्राप्त करता है। यह एक आम गलत धारणा है कि यूनिक्स में स्टड अजेय है। यह तथ्य है, यह फ़ाइल प्रकार के आधार पर, खोज योग्य हो सकता है।
अंक

@styrofoamfly क्या आपका मतलब है कि read()एक फ़ाइल से क्रमिक रूप से डेटा पढ़ें, जबकि mmap()एक ही बार में पूरी फ़ाइल को मेमोरी में पढ़ें?
टिम

1
@JohnBollinger No. कि GNU प्रोजेक्ट शुरू होने से पहले 1980 में SysIII से वापस आने के लिए कम से कम वापस आने की तारीख थी और sortPOSIX सहित अधिकांश मानक उपयोगिताओं के लिए समर्थित होना आवश्यक था । लेकिन यह सच है कि यह हमेशा समर्थित नहीं है।
स्टीफन चेजलस

2
मेरी क्षमा याचना, @ स्टीफनचेज़ेलस, आप सम्मेलन की उत्पत्ति के बारे में सही हैं, और मैं आगे भी इस बात पर मुहर लगाऊंगा कि getopt()C फ़ंक्शन के लिए POSIX विनिर्देशन तर्क के इस महत्व को पहचानता है --। लेकिन मुख्य बिंदु वह है जिसे आप स्वीकार करते हैं: तर्क हैंडलिंग व्यक्तिगत कार्यक्रमों का डोमेन है, और सभी --विशेष रूप से व्यवहार नहीं करते हैं ।
जॉन बोलिंजर

17

मुद्दा एक डैश के साथ शुरू होने वाले फ़ाइल नाम हैं। sort "$f1"काम नहीं करता है अगर मूल्य के f1साथ शुरू होता है -क्योंकि कमांड एक विकल्प के रूप में मूल्य की व्याख्या करेगा। यह आमतौर पर एक त्रुटि के रूप में होता है, लेकिन यह सुरक्षा छेद का कारण भी बन सकता है । इसके साथ sort -- "$f1", डबल डैश तर्क का --अर्थ है "इस बिंदु से परे कोई विकल्प नहीं" इसलिए f1विकल्प के रूप में मूल्य की व्याख्या नहीं की जाएगी। लेकिन अभी भी एक किनारे का मामला है: अगर मूल्य f1एक डैश है और कुछ नहीं, तो यह एक विकल्प नहीं है, यह तर्क है -, जिसका अर्थ है "मानक इनपुट" (क्योंकि तर्क एक इनपुट फ़ाइल है; आउटपुट फ़ाइल के लिए; इसका मतलब होगा "मानक आउटपुट")।

पुनर्निर्देशन का उपयोग इन सभी नुकसान से बचा जाता है।

यह ज्यादातर कमांड पर लागू होता है, न कि सिर्फ sort


क्या आप कह रहे हैं कि sort < "$f1"अगर मूल्य के बराबर होता तो काम करेगा -? यह मैंने कोशिश की किसी भी खोल में नहीं है।
grawity

@ समानता, तुलना seq 10 > -; sort -करें seq 10 > -; sort < -
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.