सॉर्ट -o क्यों उपयोगी है?


32

UNIX दर्शन कहता है: एक काम करो और इसे अच्छे से करो। ऐसे कार्यक्रम बनाएं जो पाठ को संभालते हैं, क्योंकि यह एक सार्वभौमिक इंटरफ़ेस है।

sortआदेश, कम से कम जीएनयू प्रकार में, एक है -oके बजाय एक फाइल करने के लिए उत्पादन करने के लिए विकल्प stdoutsort foobar -o whateverजब मैं सिर्फ कह सकता हूं, तो उपयोगी क्यों है sort foobar > whatever?


3
GNU की UNIX नहीं है। कई पहलुओं में यह अलग है, उदाहरण के लिए क्रिया तर्क (--help, आदि)।
साकिस

@ खरीफ हां यह सच है । लेकिन मैं तर्क दूंगा कि यह इस विशिष्ट प्रश्न का उत्तर नहीं है।
११:१३

2
इसलिए मैंने इसे टिप्पणी के रूप में छोड़ दिया और उत्तर नहीं :)
sakisk

जवाबों:


47

यह सिर्फ GNU तरह का नहीं है। बीएसडी सॉर्ट के पास भी है। और क्यों?
(मुझे लगा कि यह एक अच्छा सवाल था ...)

मैन पेज से: "दिया गया तर्क मानक आउटपुट के बजाय उपयोग की जाने वाली आउटपुट फ़ाइल का नाम है। यह फाइल इनपुट फ़ाइलों में से एक के समान हो सकती है।"

आप उसी फ़ाइल पर पुनर्निर्देशन के साथ नहीं जा सकते, आउटपुट पुनर्निर्देशन फ़ाइल को मिटा देता है।

आगे स्पष्ट करने के लिए, अगर मैं किसी फ़ाइल को सॉर्ट करना चाहता था और सॉर्ट किए गए परिणामों को उसी स्थान पर रखता था, तो मैं कोशिश करने के लिए सोच सकता हूं sort < foo > foo। आउटपुट रिडायरेक्शन को छोड़कर आउटपुट fooप्राप्त करने की तैयारी में फ़ाइल को काट देता है । और फिर छाँटने की कोई बात नहीं है। "-ओ" के बिना इसे करने का तरीका होगा sort < foo > bar ; mv bar foo। मुझे लगता है कि -oविकल्प कुछ ऐसा ही करता है बिना आपको इसके बारे में चिंता करने की जरूरत नहीं है।


12
आप यह भी कह सकते हैं sudo sort -o /some/placeकि आपके गैर-निजीकृत उपयोगकर्ता को लिखने की अनुमति नहीं है।
बहमट

8
और बहमट की टिप्पणी के साथ भ्रम से बचने में मदद करने के लिए: वह यह नहीं कह रहा है कि वे एक फ़ाइल को सॉर्ट कर सकते हैं जिसके लिए उनके पास अनुमति नहीं है। I / O पुनर्निर्देशन काम करता है ... खराब तरीके से सुडो के साथ। चूँकि आपके शेल में पुनर्निर्देशन होता है (sudo सिर्फ एक कमांड है जो इसे चलाने वाला है), sudo के माध्यम से कमांड के साथ पुनर्निर्देशन का उपयोग करना कष्टप्रद है। (मैं शुरू में उलझन में था कि बाहमट क्या कह रहा था, इसलिए लगा कि दूसरे भी भ्रमित हो सकते हैं)।
कुर्टम

3
सिर्फ शैतान के वकील की भूमिका निभाने के लिए, वास्तव में "इनपुट फाइल दोनों आउटपुट फाइल के समान है" समस्या और "विशेषाधिकार प्राप्त पुनर्निर्देशन" समस्या दोनों के विकल्प हैं, और दोनों विकल्प "एक काम अच्छी तरह से" करने की भावना में अधिक हैं। "इनपुट = आउटपुट" के लिए, sponge(अधिक जानकारी का हिस्सा) है। विशेषाधिकार प्राप्त रीडायरेक्शन नहीं करने के लिए पाइप जाता है | sudo tee, जो भी एक भी साधारण प्रोग्राम करने के लिए विशेषाधिकार वृद्धि को सीमित करने का लाभ मिलता है, tee
jw013

अच्छे अंक। हालांकि स्पंज -oकरने sortसे बहुत पहले ही विकल्प मौजूद था। यह कम से कम 4.4-lite2 जितना पुराना है (जो कि ओपनबीएसडी सीवीएस में इतिहास शुरू होता है)। और ऐसे मामले के लिए जहां आप एक गैर-विशेषाधिकार प्राप्त फ़ाइल पर काम कर रहे हैं और एक विशेषाधिकार प्राप्त क्षेत्र को लिख रहे हैं, | sudo teeमहान काम करता है, लेकिन अधिकांश समय के लिए, आप पूरी चीज़ को विशेषाधिकार प्राप्त करना चाहते हैं, और sudoआपको यात्राएं करते हैं। और sudo grep file | sudo teeमूर्खतापूर्ण है।
कुर्टम

1
sortपूरे इनपुट को पढ़ने की जरूरत है इससे पहले कि यह कुछ भी आउटपुट करना शुरू कर सकता है, इसीलिए यह अपने इनपुट को सुरक्षित रूप से अधिलेखित कर सकता है। यह आउटपुट शुरू करने से पहले मेमोरी या अस्थायी फ़ाइलों में डेटा स्टोर कर सकता है।
स्टीफन चेज़लस

12

'-ओ' विकल्प पहले से ही यूनिक्सsort के छठे संस्करण में था

हालाँकि मैं आपसे सहमत हूँ कि यह यूनिक्स दर्शन के भीतर नहीं है। uniqउस विकल्प के पास नहीं था (और तब sortनहीं था -u)।

मेरे पीडीपी -11 पर मैंने एक छोटा प्रोग्राम इस्तेमाल किया जो एक पैरामीटर लेगा:

renac whatever

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

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

यह पहला (यदि पहला नहीं) वास्तविक सी प्रोग्राम था जो मैंने बनाया था (अपनी नौकरी के लिए मैं ज्यादातर इस प्रणाली में पास्कल में विकसित हुआ था)।


अगर मुझे अच्छी तरह से समझ में आ गया है, aptस्वादित GNU / Linux के लोगों के पास renacउपलब्ध कार्यक्षमता का एक पुनर्लेखन संस्करण हो सकता है , जिसे प्रोग्राम कहा जाता है sponge(से man: मानक इनपुट को ), package सोखें और फ़ाइल moreutils पर लिखें।
41754

@uprego। मैंने बस स्पॉन्ज.सी के स्रोत को देखा और ऐसा लगता है कि स्पॉन्गिंग (स्टड -> स्टडआउट) की कार्यक्षमता के कारण इसमें बहुत अधिक कोड ओवरहेड होता है।
एंथन

@uprego न spongeहै और न ही moreutilsवास्तव में जीएनयू द्वारा बनाया गया था।
jw013

मैंने यह दावा करने का इरादा नहीं किया है।
1075 पर 41754
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.