"बिल्ली के बेकार उपयोग" पर आम सहमति क्या है?


41

जब मैं कई यूनिक्स कमांड जैसे कि grep, sed, tr आदि को पाइप करता हूं, तो मैं उस इनपुट फ़ाइल को निर्दिष्ट करता हूं जिसे बिल्ली का उपयोग करके संसाधित किया जा रहा है। तो कुछ ऐसा है cat file | grep ... | awk ... | sed ...

लेकिन हाल ही में मेरे उत्तरों पर कुछ टिप्पणियों के बाद यह दर्शाता है कि यह बिल्ली का बेकार उपयोग था, मैंने सोचा कि मैं यहां सवाल पूछूंगा।

मैंने इस मुद्दे को देखा और UUOC और यूजलेस यूज ऑफ कैट अवार्ड पर विकिपीडिया के लेख में आया और मुझे लगता है कि जो तर्क दिए गए हैं वे दक्षता के दृष्टिकोण से हैं।

मैं यहाँ आया सबसे करीबी प्रश्न यह था: क्या बिल्ली को कॉल करना व्यर्थ है? - लेकिन यह बिल्कुल नहीं है जो मैं पूछ रहा हूं।

मुझे लगता है कि यूयूओसी शिविर का सुझाव क्या उपयोग करना है cmd1 args < file | cmd2 args | cmd3 ..या यदि कमांड में फ़ाइल से पढ़ने का विकल्प है तो फ़ाइल में एक तर्क के रूप में पास करने के लिए।

लेकिन मुझे cat file | cmd1 ... | cmd2पढ़ना और समझना बहुत आसान लगता है। मुझे अलग-अलग कमांड में इनपुट फाइल भेजने के विभिन्न तरीकों को याद नहीं करना है, और प्रक्रिया तार्किक रूप से बाएं से दाएं बहती है। पहले इनपुट, फिर पहली प्रक्रिया ... वगैरह।

क्या मैं यह समझने में असफल रहा कि बिल्ली के बेकार उपयोग के बारे में क्या तर्क दिए जा रहे हैं? मैं समझता हूं कि अगर मैं एक क्रोन नौकरी चला रहा हूं जो हर 2 सेकंड में चलती है जो बहुत प्रसंस्करण करती है, तो उस स्थिति में बिल्ली बेकार हो सकती है। लेकिन अन्यथा बिल्ली के उपयोग पर आम सहमति क्या है?


16
मैं सहमत हूं, यहां, बिल्ली को कॉल करना अक्षम हो सकता है, लेकिन यह बाद में समझने और संपादित करने के लिए आदेश को बहुत आसान बनाता है, और (महत्वपूर्ण रूप से, IMO) प्रत्येक अलग-अलग कमांड को सिर्फ एक काम करने के लिए अलग कर देता है, जिससे पूरी बात बहुत आसान हो जाती है साथ में।
फोसिी

4
आम सहमति यह है कि आम सहमति नहीं है।
jwg

2
यह बड़े पैमाने पर stackoverflow.com/questions/11710552/useless-use-of-cat (हालांकि यह पूर्वसूचक करता है) को डुप्लिकेट करता है।
ट्रिपल

1
यह मत भूलो कि < file cmd1 args | cmd2 args ...काम भी करता है ... इसलिए " बाएं से दाएं " का आपका तर्क शून्य है। मैं अक्सर स्पष्टता के लिए इसका उपयोग करता हूं - मैंने जो आदेश दिखाया, वह लोगों को विराम दे सकता है, जो अच्छा नहीं है। उच्च धागा मायने रखता है के साथ आदर्श बन जाता है, यह कम हो रहा है एक मुद्दा IMO ...
एट्री

जवाबों:


21

यह इस अर्थ में व्यर्थ है कि इसका उपयोग करना ऐसा नहीं है जो दूसरे को पूरा नहीं करता है, संभवतः अधिक कुशल विकल्प (यानी उचित परिणाम पैदा नहीं कर सकते हैं)।

लेकिन catजिस तरह से अधिक शक्तिशाली है cat somefileइस उत्तर में मैंने जो लिखा है,man cat उससे परामर्श करें या पढ़ें । लेकिन अगर आपको पूरी तरह से सकारात्मक रूप से केवल एक फ़ाइल की सामग्री की आवश्यकता है, तो आपको फ़ाइल सामग्री पर प्राप्त करने के लिए उपयोग न करने से कुछ प्रदर्शन लाभ मिल सकता है ।cat

पठनीयता के बारे में, यह आपके व्यक्तिगत स्वाद पर निर्भर करता है। मुझे catएक ही कारण से अन्य कमांड में फाइलें पसंद हैं, खासकर अगर प्रदर्शन के पहलू नगण्य हैं।

यह इस बात पर भी निर्भर करता है कि आप क्या स्क्रिप्टिंग कर रहे हैं। यदि यह आपकी खुद की शेल और आपके डेस्कटॉप मशीन की सुविधा के तरीके हैं, तो आपके अलावा कोई भी परवाह नहीं करेगा। यदि आप किसी ऐसे मामले पर ठोकर खाते हैं, जहां श्रृंखला में अगला उपकरण तलाशने में सक्षम होना बेहतर होगा, और इसे कम-प्रदर्शन वाले राउटर पर कुछ न्यूनतम लिनक्स सिस्टम या वास्तविक सीमा वाले समान डिवाइस पर अक्सर उपयोग किए जाने वाले सॉफ़्टवेयर के रूप में वितरित करें। प्रसंस्करण क्षमता, यह अलग है। यह हमेशा संदर्भ पर निर्भर करता है।


3
क्या प्रदर्शन लागत नगण्य है? कई मामलों में वे हैं: oletange.blogspot.dk/2013/10/useless-use-of-cat.html
Ole Tange

15

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

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

यह कार चलाते समय ऐसा है, जब आप केवल तीन अधिकार बना सकते हैं, तो बाएं मोड़ क्यों? बेशक आप कर सकते हैं, और यह पूरी तरह से काम करता है। लेकिन अगर आप वाम मोर्चे की ताकत को समझते हैं तो तीन अधिकार सिर्फ मूर्खतापूर्ण लगते हैं।

यह एक फ़ाइल हैंडल, 17k RAM और 0.004 सेकंड CPU समय बचाने के बारे में नहीं है। यह UNIX का उपयोग करने के संपूर्ण दर्शन के बारे में है। मेरे चित्रण में "बाएं मुड़ने की शक्ति" केवल इनपुट पुनर्निर्देशित नहीं है, यह UNIX दर्शन है। पूरी तरह से इसे करने से आप अपने आस-पास के लोगों की तुलना में बहुत बेहतर बनेंगे और आप उन लोगों से सम्मान प्राप्त करेंगे जो इसे समझते हैं।


2
यदि आप ट्रैफिक लाइट के बिना 6-लेन व्यस्त व्यस्त राजमार्ग पर बाएं मुड़ने के बारे में सोच रहे हैं, तो यह आपको सही मोड़ पर विचार करने के लिए, या एक अलग मार्ग लेने पर विचार कर सकता है। * निक्स आपको कई मार्गों का विकल्प देता है। यह व्यक्तिगत प्राथमिकता और पठनीयता की बात है। अगर आप "cat file | cmd1 | cat | cmd2 | more" चाहते हैं, तो आगे बढ़ें। (कभी-कभी यह उपयोगी होता है यदि cmd1 पेजेट - बिल्ली इसे खत्म कर देगा।) $ CPU समय << $ मस्तिष्क का समय।
माइक

1
@MikeP catकिसी भी पेजिंग को खत्म नहीं करेगा, हालांकि कुछ को पाइप करने से कुछ एप्लिकेशन द्वारा पेजिंग को खत्म किया जा सकता है।
त्रिकालिका

14

मैं अक्सर cat file | myprogramउदाहरणों में उपयोग करता हूं । कभी-कभी मुझ पर बिल्ली के बेकार इस्तेमाल का आरोप लगाया जा रहा है ( http://www.iki.fi/era/unix/award.html )। मैं निम्नलिखित कारणों से असहमत हूं:

यह समझना आसान है कि क्या चल रहा है।

UNIX कमांड को पढ़ते समय आप एक कमांड की अपेक्षा करते हैं जिसके बाद तर्कों का पुनर्निर्देशन होता है। यह है संभव पुनर्निर्देशन कहीं भी डाल करने के लिए, लेकिन यह शायद ही कभी देखा जाता है - इस प्रकार लोगों को एक कठिन समय उदाहरण पढ़ने होगा। मेरा मानना ​​है

    cat foo | program1 -o option -b option | program2

से पढ़ना आसान है

    program1 -o option -b option < foo | program2

यदि आप शुरू में पुनर्निर्देशन को स्थानांतरित करते हैं तो आप उन लोगों को भ्रमित कर रहे हैं जो इस वाक्य-विन्यास के अभ्यस्त नहीं हैं:

    < foo program1 -o option -b option | program2

और उदाहरणों को समझना आसान होना चाहिए।

इसे बदलना आसान है।

यदि आप जानते हैं कि कार्यक्रम बिल्ली से पढ़ सकता है, तो आप सामान्य रूप से मान सकते हैं कि यह किसी भी प्रोग्राम से आउटपुट को पढ़ सकता है जो STDOUT को आउटपुट करता है, और इस प्रकार आप इसे अपनी आवश्यकताओं के लिए अनुकूलित कर सकते हैं और अनुमानित परिणाम प्राप्त कर सकते हैं।

यह जोर देता है कि कार्यक्रम विफल नहीं होता है, अगर STDIN एक नियमित फ़ाइल नहीं है।

यह मान लेना सुरक्षित नहीं है कि अगर program1 < fooकाम करता है तो cat foo | program1काम भी करेगा। हालांकि, यह है विपरीत ग्रहण करने के लिए अभ्यास सुरक्षित में। यह प्रोग्राम काम करता है यदि STDIN एक फाइल है, लेकिन यदि इनपुट पाइप है, तो यह विफल रहता है, क्योंकि यह खोज का उपयोग करता है:

    # works
    < foo perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

    # fails
    cat foo | perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

मैंने http://oletange.blogspot.dk/2013/10/useless-use-of-cat.html पर प्रदर्शन के दंड को देखा है । cat file |यदि प्रसंस्करण की जटिलता एक साधारण grep के समान है तो निष्कर्ष का उपयोग नहीं किया जाता है। और प्रदर्शन पठनीयता से अधिक मायने रखता है। अन्य स्थितियों के cat file |लिए ठीक है।


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

12

मुझे लगता है कि यूयूओसी होने के बारे में टिप्पणी करने वालों में से कुछ द्वारा ली जा रही स्थिति यह है कि अगर कोई वास्तव में यूनिक्स और शेल सिंटैक्स को समझता है, तो कोई भी उस संदर्भ में बिल्ली का उपयोग नहीं करेगा। इसे गरीब व्याकरण का उपयोग करने के रूप में देखा जाता है: मैं गरीब व्याकरण का उपयोग करते हुए एक वाक्य लिख सकता हूं और अभी भी अपनी बात को प्राप्त कर सकता हूं, लेकिन मैं भाषा की मेरी खराब समझ और विस्तार से, मेरी खराब शिक्षा का भी प्रदर्शन करता हूं। इसलिए यह कहना कि कुछ UUOC है, यह कहने का एक और तरीका है कि कोई यह नहीं समझता कि वे क्या कर रहे हैं।

जहाँ तक दक्षता जाती है, यदि आप कमांड लाइन से पाइप लाइन निष्पादित कर रहे हैं, तो मशीन को निष्पादित करने में कम समय लगता है, क्योंकि यह cat somefile |सोचने के लिए कि क्या यह उपयोग करने के लिए अधिक कुशल हो सकता है < somefile। यह सिर्फ मायने नहीं रखता।


6
काफी समय से मुझे पता है कि cat somefile | progबिल्ली के बिना खोल में व्यक्त करने के अन्य तरीके थे , prog < somefileलेकिन वे हमेशा मुझे गलत क्रम में प्रतीत होते थे, विशेष रूप से एक साथ पाई जाने वाली आदेशों की श्रृंखला के साथ। अब मैं देखता हूं कि कुछ उतना ही सुरुचिपूर्ण है जितना < somefile progकि चाल, धन्यवाद। मैं बिल्ली के उपयोग के लिए छोड़े गए बहाने से बाहर चला गया हूं।
एलेक्स

4

मुझे आज तक इस पुरस्कार के बारे में पता नहीं था जब कुछ बदमाशों ने मेरे एक जवाब के लिए मुझ पर UUOC पिन करने की कोशिश की। यह एक था cat file.txt | grep foo | cut ... | cut ...। मैंने उसे अपने मन का एक टुकड़ा दिया, और ऐसा करने के बाद ही उसने मुझे इस पुरस्कार की उत्पत्ति और ऐसा करने की प्रथा का जिक्र किया। आगे की खोज ने मुझे इस प्रश्न की ओर अग्रसर किया। कुछ भी होश में विचार के बावजूद दुर्भाग्य से कोई भी जवाब मेरे तर्क में शामिल नहीं था।

मुझे उसे शिक्षित करते समय रक्षात्मक होने का मतलब नहीं था। आखिरकार, मेरे छोटे वर्षों में मैंने कमांड लिखी होगी grep foo file.txt | cut ... | cut ...क्योंकि जब भी आप लगातार सिंगल grepएस करते हैं तो आप फ़ाइल तर्क की नियुक्ति सीखते हैं और यह तैयार ज्ञान है कि पहले पैटर्न है और बाद में फ़ाइल नाम हैं।

यह एक सचेत विकल्प था जब मैंने cat"अच्छे स्वाद" (लिनुस टॉर्वाल्ड्स के शब्दों में) के कारण आंशिक रूप से उपसर्ग के साथ सवाल का जवाब दिया, लेकिन मुख्य रूप से फ़ंक्शन के सम्मोहक कारण के लिए।

उत्तरार्द्ध कारण अधिक महत्वपूर्ण है इसलिए मैं इसे पहले बाहर कर दूंगा। जब मैं एक समाधान के रूप में एक पाइपलाइन की पेशकश करता हूं तो मुझे उम्मीद है कि यह पुन: प्रयोज्य होगा। यह काफी संभावना है कि एक पाइपलाइन को अंत में जोड़ा जाएगा या किसी अन्य पाइपलाइन में जोड़ा जाएगा। उस स्थिति में पुन: प्रयोज्यता को कम करने के लिए एक फ़ाइल तर्क रखने, और संभवतः फ़ाइल त्रुटि मौजूद होने पर त्रुटि संदेश के बिना चुपचाप ऐसा करते हैं । अर्थात। grep foo xyz | grep bar xyz | wcआपको कितनी लाइनें xyzमिलेंगी barजबकि आप उन पंक्तियों की संख्या की अपेक्षा कर रहे हैं जिनमें दोनों fooऔर हैं bar। त्रुटियों से ग्रस्त होने से पहले एक पाइपलाइन में एक कमांड के लिए तर्क को बदलना। इसे मौन विफलताओं की संभावना से जोड़ें और यह एक विशेष रूप से कपटी अभ्यास बन जाता है।

पूर्व कारण "बहुत अच्छा स्वाद" के बाद से महत्वहीन नहीं है, केवल ऊपर की मौन विफलताओं जैसी चीजों के लिए एक सहज अवचेतन तर्क है जो आप उस समय सही नहीं सोच सकते हैं जब कोई व्यक्ति शिक्षा की आवश्यकता को कहता है "लेकिन नहीं है" वह बिल्ली बेकार है ”।

हालाँकि, मैं पूर्व के "अच्छे स्वाद" के कारण भी अवगत कराने का प्रयास करूँगा जिसका मैंने उल्लेख किया है। यही कारण है कि यूनिक्स के रूढ़िवादी डिजाइन भावना के साथ करना है। grepकरता है cutऔर नहीं lsकरता है grep। इसलिए बहुत कम से कम grep foo file1 file2 file3डिजाइन की भावना के खिलाफ जाता है। इसे करने का ऑर्थोगोनल तरीका है cat file1 file2 file3 | grep foo। अब, grep foo file1यह केवल एक विशेष मामला है grep foo file1 file2 file3, और यदि आप इसका इलाज नहीं करते हैं तो आप कम से कम ब्रेन क्लॉक चक्रों का उपयोग करके बेकार बिल्ली पुरस्कार से बचने की कोशिश कर रहे हैं।

यह हमें उस तर्क की ओर ले जाता है जो grep foo file1 file2 file3समवर्ती है, और catसमवर्ती है, इसलिए यह उचित है, cat file1 file2 file3लेकिन क्योंकि catसमवर्ती नहीं है cat file1 | grep fooइसलिए हम catऔर सर्वशक्तिमान यूनिक्स दोनों की भावना का उल्लंघन कर रहे हैं । खैर, अगर ऐसा होता तो एक फाइल के आउटपुट को पढ़ने के लिए यूनिक्स को अलग कमांड की जरूरत होती है और इसे थूकने के लिए थूकना पड़ता है (इसे पगनेट नहीं करना चाहिए या स्टैडआउट को सिर्फ एक शुद्ध थूक)। इसलिए आपके पास ऐसी स्थिति होगी जहां आप कहते हैं cat file1 file2या आप कहते हैं dog file1और ईमानदारी से याद रखें cat file1कि पुरस्कार प्राप्त करने से बचने के लिए, जबकि dog file1 file2उम्मीद है कि बचने के बाद से dogकई फ़ाइलों को निर्दिष्ट किए जाने पर डिज़ाइन में त्रुटि हो सकती है।

उम्मीद है कि इस बिंदु पर आप यूनिक्स डिजाइनरों के साथ सहानुभूति रखते हैं, जिसमें एक अलग कमांड शामिल करने के लिए एक फाइल को स्टडआउट करने के लिए नहीं है, जबकि catइसे किसी अन्य नाम देने के बजाय कॉन्टेनेट करने के लिए भी नामकरण किया गया है। <edit>इस तरह के एक कुत्ते, दुर्भाग्यपूर्ण <ऑपरेटर है। यह आसान संरचना को रोकने के लिए पाइपलाइन के अंत में दुर्भाग्यपूर्ण है। शुरुआत में इसे रखने के लिए कोई कृत्रिम रूप से या सौंदर्य से साफ तरीका नहीं है। यह सामान्य रूप से पर्याप्त नहीं होने के कारण भी दुर्भाग्यपूर्ण है, इसलिए आप कुत्ते के साथ शुरू करते हैं लेकिन बस एक और फ़ाइल नाम जोड़ते हैं यदि आप भी चाहते हैं कि इसे पिछले एक के बाद संसाधित किया जाए। ( >दूसरी ओर आधा खराब नहीं है। अंत में इसका लगभग सही स्थान है। यह आमतौर पर एक पाइपलाइन का पुन: उपयोग करने योग्य हिस्सा नहीं है, और तदनुसार यह प्रतीकात्मक रूप से प्रतिष्ठित है।)</edit>

अगला सवाल यह है कि ऐसे आदेश क्यों महत्वपूर्ण हैं जो केवल एक फाइल थूकते हैं या किसी फाइल को आगे बढ़ाने के लिए बिना किसी प्रोसेसिंग के स्टेपआउट करने के लिए कहते हैं? एक कारण हर एक यूनिक्स कमांड होने से बचने के लिए है जो कम से कम एक कमांड लाइन फ़ाइल तर्क को पार्स करने के लिए मानक इनपुट पर संचालित होता है और मौजूद होने पर इसे इनपुट के रूप में उपयोग करना है। दूसरा कारण उपयोगकर्ताओं को याद रखने से बचना है: (ए) जहां फ़ाइल नाम के तर्क चलते हैं; और (बी) जैसा कि ऊपर बताया गया है, साइलेंट पाइपलाइन बग से बचें।

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

अंत में, जो बेहतर किया जा सकता था वह यह है कि यदि मानक इनपुट उपलब्ध हो तो ऐसी असाधारण आज्ञाएँ grep(लेकिन आवश्यक नहीं ls) एक त्रुटि उत्पन्न करती हैं। यह उचित है क्योंकि कमांड में तर्क शामिल हैं जो उपयोगकर्ता सुविधा के लिए सर्वशक्तिमान यूनिक्स की ऑर्थोगोनल भावना का उल्लंघन करता है। आगे उपयोगकर्ता की सुविधा के लिए, अर्थात एक मौन विफलता के कारण होने वाली पीड़ा को रोकने के लिए, इस तरह के आदेशों को उपयोगकर्ता को सचेत करने में अपने स्वयं के उल्लंघन का उल्लंघन करने में संकोच नहीं करना चाहिए यदि मौन विफलता की संभावना है।


1
जैसा कि इस उत्तर और प्रश्न के क्रॉस-साइट डुप्लिकेट पर चर्चा की गई है, grep pattern f1 f2 f3सरल निष्कर्ष नहीं हैgrepफाइलों के बारे में जानता है, और फ़ाइल नाम (और वैकल्पिक रूप से लाइन नंबर, और जो कुछ भी है) प्रिंट करता है। grep . /sys/kernel/mm/transparent_hugepage/*फ़ाइल नाम मुद्रण के लिए एक अच्छा हैक है: एकल-लाइन फ़ाइलों के साथ फ़ाइल-सामग्री। क्लासिक यूनिक्स डिजाइन यह है कि अधिकांश उपयोगिताओं की *.txtआवश्यकता के बिना काम करते हैं catcatएक स्ट्रीम में कई फ़ाइलों को समतल करने के लिए है।
पीटर कॉर्ड्स

@PeterCordes मैंने सिर्फ grep के बारे में इतना नहीं लिखा। त्रुटियों / कॉपी-पेस्ट की मजबूती के बारे में मैंने जो महत्वपूर्ण मुद्दे देखे हैं; शुद्धता बनाम प्रदर्शन, जिसे आपने आसानी से कुछ क्षुद्र / परिधीय चिंता के पक्ष में अनदेखा करने के लिए चुना है।
रैंडमस्ट्रिंग

आप कुछ दिलचस्प और मान्य बिंदु बनाते हैं, विशेष रूप से उन त्रुटियों के बारे में जिन्हें आप कॉपी / पेस्ट करते समय प्राप्त कर सकते हैं। मेरा सुझाव है कि अपने grepउदाहरण को एक ऐसे प्रोग्राम से बदलें , cutजिसमें कई फाइलों की देखभाल करने का कोई कारण नहीं है, और इसे हमेशा अपने स्टड से खिलाया जा सकता है। कुछ उपयोगिताओं, जैसे tr, फ़ाइल अर्गल्स को बिल्कुल स्वीकार नहीं करते हैं, और केवल एक फिल्टर के रूप में काम करते हैं, इसलिए पसंद catऔर बीच में है <
पीटर कॉर्डेस

1
आपकी पोस्ट के साथ मेरी सबसे बड़ी समस्या यह है कि आप इनपुट पुनर्निर्देशन को छूट देते हैं। <file cmd1 | cmd2 >outयह अद्भुत नहीं है, मैं मानता हूं, लेकिन इसकी आदत डालना पूरी तरह से संभव है। आप मजाकिया अंदाज में "अल्माइटी यूनिक्स की भावना" के बारे में सोचते रहते हैं, जो मेरे लिए पूरी तरह से सपाट हो जाता है क्योंकि ऐसा लगता है कि आप या तो नहीं मिलते हैं या यूनिक्स डिजाइनर वास्तव में ऐसा नहीं चाहते हैं। यदि आप यूनिक्स डिजाइन पसंद नहीं करते हैं तो यह ठीक है, लेकिन यह स्वाभाविक रूप से गूंगा नहीं है। मुझे यकीन नहीं है कि अगर ओएस का डिज़ाइन शेल सिंटैक्स से पहले होता है, और यह सब कैसे विकसित हुआ, लेकिन cat1970 में एक अतिरिक्त टालने लायक था!
पीटर कॉर्डेस

1
@PeterCordes मेरे विचार में लंबे समय से हवा-हवाई था, जो कि सबसे महत्वपूर्ण बिंदु से अलग होता है - शुद्धता पहले, अनुकूलन दूसरा। अतिरिक्त catपाइपलाइनों के पुन: उपयोग और विभाजन में मदद करता है, जबकि इसके बिना आपको मौन विफलताएं मिल सकती हैं (मेरे जवाब में "चुपचाप खोज")।
रैंडमस्ट्रिंग

2

बिल्ली के बेकार उपयोग की रक्षा में

(इस प्रथा के खिलाफ नागवार टिप्पणियों की सुनामी को संतुलित करने में मदद करने के लिए कुछ पैराग्राफ)

मैं बहुत सालों से दोनों को शेल के रूप में और छोटी स्क्रिप्ट के लिए एक स्क्रिप्टिंग भाषा के रूप में उपयोग कर रहा हूं (और कभी-कभी अफसोस के साथ किसी और के लिए नहीं)। एक लंबे समय से पहले मैं "बिल्ली का बेकार उपयोग" (UUoC) के बारे में सीखा है। मैं अभी भी कम से कम हर हफ्ते इसके लिए दोषी हूं , लेकिन स्पष्ट रूप से मैं शायद ही कभी इसे महसूस करने के लिए मजबूर होने वाला एक छोटा सा भी महसूस करता हूं। मेरा मानना ​​है कि तकनीकी मतभेदों की तुलना में catबनाम < fileका उपयोग स्वाद के बारे में अधिक है और मैंने यह जवाब लिनक्स पर नए लोगों की रक्षा के लिए लिखा है जो मेरे स्वाद को साझा करते हैंcatयह सोचकर कि उनके रास्ते में कुछ गड़बड़ है (और कुछ मौकों पर ध्यान दें)। लिनुस टोरवाल्ड्स की तरह मेरा भी मानना ​​है कि अक्सर स्वाद कौशल से ज्यादा महत्वपूर्ण है। इसका मतलब यह नहीं है कि मेरा स्वाद आपकी तुलना में बेहतर है लेकिन इसका मतलब यह है कि अगर कुछ बुरा स्वाद लेता है तो मैं ऐसा करने के लिए योग्य नहीं हूं।

यह पहले से ही स्पष्ट है कि प्रश्न लेखक की तरह मुझे लगता है कि कैट का उपयोग करना बहुत स्वाभाविक है, जैसे बैश जैसे आरईपीएल पर काम करना जहां मैं जटिल कमांड का निर्माण करके समस्या की खोज कर रहा हूं। यहाँ एक बहुत ही विशिष्ट उदाहरण है: मेरे पास एक पाठ फ़ाइल है और इसके बारे में ज्यादा जानकारी नहीं है। मैं cat fileसामग्री का स्वाद लेने के लिए टाइप करूंगा । अगर उत्पादन बहुत ज्यादा है मैं तीर मेरी मारा जाएगा और परिस्थितियों के आधार पर मैं जोड़ देंगे | headया | grep fooया | what_everप्रसंस्करण चरणों जोड़कर अपने पिछले आदेश का विस्तार। वृद्धिशील तरीके से एक साधारण कमांड से एक और अधिक जटिल एक के बाद एक प्रसंस्करण कदम जोड़कर जा रहा है, जो मुझे बहुत स्वाभाविक लगता है (मैं ipython पर भी ऐसा ही कर रहा हूं और मुझे इस तरह से प्यार हैpyfunctionalऔर इसी तरह के प्रोग्रामिंग टूल इस शैली को शामिल करते हैं)। इसलिए बैश शेल पर काम करते समय मुझे विश्वास है कि मेरे प्रवाह को बाधित करने catसे ज्यादा बेकार है और इसे भुगतना होगा ... 99.9% मामलों में कोई भी परिणाम नहीं होगा।

बेशक जब स्क्रिप्ट लेखन चीजें बदल सकती हैं। लेकिन स्क्रिप्ट लिखते समय भी यह मेरी राय है कि जो लोग UUoC का मजाक उड़ाते हैं, वे इस महत्वपूर्ण सबक को बड़े दिमाग से अनदेखा करते हैं: "समयपूर्व अनुकूलन सभी बुराई की जड़ है" । और अगर आप कुछ atypical नहीं कर रहे हैं तो यह UUoC के लिए वास्तव में कठिन है जहां अनुकूलन की आवश्यकता होगी। बेशक, आपको निश्चित रूप से यह जानने की जरूरत है कि इसके बारे में क्या अकुशल है (यह अतिरिक्त प्रक्रिया आह्वान है BTW क्योंकि कुछ लोग इसका उल्लेख करते हैं)। उस ज्ञान के बाद यदि आप उन दुर्लभ प्रणालियों पर काम करते हैं, जहां एक प्रक्रिया को लागू करना महंगा है (उदाहरण के लिए कुछ एम्बेडेड सिस्टम या कुछ हद तक CygWin) तो आपको पता चल जाएगा कि यदि एक विशेष स्थिति की आवश्यकता होती है तो क्या करना है। उदाहरण के लिए यदि आप स्वयं को बुलाते हुए पाते हैंcatकई बार एक पाश में (बीटीडब्ल्यू यदि आप खुद को उस स्थिति में पाते हैं तो अपने आप से पूछें कि क्या बैश काम का सही उपकरण है)। फिर से: "पहले इसे सही ढंग से काम करें फिर यदि आवश्यक हो तो इसे अनुकूलित करें"

और आप यूओसी निक के बारे में शिकायतों की सुनामी की व्याख्या कैसे करते हैं?

इसके अलावा हर किसी को मेरा स्वाद नहीं आता है, मेरा मानना ​​है कि UUoC के बारे में इतने सारे लोग शिकायत क्यों करते हैं, इसका एक बड़ा हिस्सा तकनीकी नहीं है, लेकिन मानव: अधिकांश यूनिक्स-नवागंतुकों को < file commandमुहावरों के बारे में नहीं पता होगा, इसलिए यह "ओल्ड गुरु" खेलने के लिए एक अधिक अनुभवी व्यक्ति को लुभा रहा है। उन्हें। उसके पास फैंसी शब्दों ("प्रक्रिया आह्वान") का उपयोग करने और "अनुकूलन" के प्रिय विषय को छूने का अवसर भी होगा। एक अच्छी धारणा की गारंटी है, इसलिए इसका विरोध करना बहुत कठिन है। तब नवागंतुक चेहरे के मूल्य पर गुरु की सलाह लेंगे और लंबे समय तक इसे दूसरों को "द ओनली ट्रुथ" (और केवल इस उत्तर को वोट दें) के रूप में फिर से दोहराएंगे। मजेदार नोट: UUoC की किसी भी अक्षमता से बचने के लिए बैश को ठीक करना इतना आसान है कि किसी को आश्चर्य हो कि किसी ने यह सुविधा क्यों नहीं जोड़ी या बनाई< filenameइतने वर्षों के बाद एक फ़ाइल बिल्ली। एक अंधेरे आत्मा का सुझाव होगा कि कुछ ग्रेबर्ड हैश हैकर्स हमें मॉक करने के लिए अवसर छोड़ना पसंद करते हैं ;-)


+1 अंतिम पैराग्राफ से प्यार करें कि क्यों मानवशास्त्रीय कारक जो इस अभ्यास का प्रचार करते हैं :-)
यादृच्छिक

1

क्या वास्तव में अच्छा होगा एक खोल है जो सिंटैक्स का समर्थन करता है जैसे:

< filename cmd | cmd2 cmd2arg1... | cmd3

इस बीच, मुझे लगता cat filename | realcmd1...है कि स्वीकार्य है, क्योंकि यह वाक्यविन्यास को प्रारंभिक आदेशों के साथ मानकीकृत रखता है जिन्हें तर्क के रूप में फ़ाइल नाम की आवश्यकता होती है।


17
बैश और इसी तरह के गोले समर्थन करते हैं < filename cmd | cmd2 ...। क्या यह काफी करीब है?
garyjohn

@garyjohn: मुझे लगता है कि आपको उत्तर के रूप में पोस्ट करना चाहिए।
केविन रीड

14
अप्रचलित पुराने शेल-हैकर टिप्पणी: बॉर्न-शैली के गोले ने < file command ...कम से कम 80 के दशक के मध्य से समर्थन किया है और मूल रूप shसे लिखे जाने के समय शायद 70 के दशक के रूप में वापस आ गया है। अधिक आम तौर पर, i / o पुनर्निर्देशन को बाएं से दाएं ओर पार्स किया जाता है, और कमांड लाइन के भीतर किसी भी क्रम में इंटरसेप्टर किया जा सकता है। तो, cmd <file arg arg...यह भी मान्य होगा।
डेल हाग्लगंड

3
हां, यह आंशिक रूप से इसलिए आसान है क्योंकि यह टाइप करना आसान है कि मैंने यूयूओसी का आविष्कार किया।
रैंडल श्वार्ट्ज

2
एक स्थानांतरित चरित्र बनाम चार अनशिफ्टेड वह बड़ा अंतर नहीं है, और मैं इसके बजाय एक अतिरिक्त प्रक्रिया, जो यहां तक ​​कि मेरे फोन को बमुश्किल नोटिस करता हूं , एक फ़ाइल को अपने प्रॉम्प्ट में पाइप की तुलना में देता है, जो मुझे हर बार एक सिरदर्द देता है जिसे मैं देखता हूं ।
आरोन मिलर

0

सभी के लिए जो कहते हैं कि बिल्ली का उपयोग करने के लिए स्वीकार्य है क्योंकि यह "बेहतर" खुशबू आ रही है या "अधिक पठनीय है" मैं केवल यह कहूंगा:

आपको शायद ... लेकिन उन लोगों को नहीं जो आपके कोड को पढ़ने या समझने की कोशिश कर सकते हैं। यदि आप कभी भी अपने उदाहरणों के साथ दूसरों को निर्देश देने या अपने कोड को साझा करने की कोशिश नहीं करेंगे, तो हर तरह से कृपया इसे अपने स्वयं के अवकाश पर उपयोग करें।

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

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

एक घरेलू उपयोगकर्ता के रूप में आप मेरी सलाह से सीख सकते हैं और चीजों को करने के बेहतर तरीके सीख सकते हैं या आप बिल्लियों की "गंध", आपकी पसंद से अंधे हो सकते हैं ... लेकिन यह जान लें कि यदि आप इस अभ्यास का खुले तौर पर उपयोग करते हैं तो आपको बुलाया जाएगा इस अभ्यास पर हर समय और आप चुपचाप यह स्वीकार करते हैं कि वे सही हैं और आप ज़िद्दी हैं क्योंकि यह सच है। :-)


मैं एक लंबे समय तक लिनक्स (और पहले * निक्स) उपयोगकर्ता और सॉफ्टवेयर डेवलपर भी हूं। आप मेरे लिए नहीं बोलते हैं जब आप कहते हैं कि "यह हमारी आँखों को ख़राब करता है" देखने के लिए cat foo.txt | ...। अन्य उत्तर अच्छी तरह से समझाते हैं कि यह एक अच्छा उपयोग क्यों हो सकता है। पक्ष में मामले का सरल सारांश है: "$ CPU समय << $ मस्तिष्क समय" (जैसा कि @MikeP ने ऊपर टिप्पणी की है)।
जिम डेलाउंट

सबसे पहले, यह 2017 से एक उत्तर था (मृत लोल को पुनर्जीवित करने का तरीका)। दूसरा, ध्यान दें कि एक व्यवस्थापक या डेवलपर के रूप में हमें हमेशा जहाँ संभव हो संसाधन उपयोग को कम करने का प्रयास करना चाहिए। जब आप उन ऐप्स और सेवाओं को लिखते हैं, जो आप मेमोरी या सीपीयू नालियों के लिए देखने की कोशिश करते हैं, जो ऐप / सेवा को बहुत कम या कोई लाभ नहीं देते हैं? वैसे UUOC वास्तव में है। अब, बिल्ली के पूरी तरह से वैध उपयोग हैं मुझे यकीन है कि पाइपिंग को कमांड में शामिल करना है ... बस अक्सर नहीं। इसलिए मैं आपके लिए नहीं बोल सकता, जैसा कि आप कहते हैं ... लेकिन अगर आप एक पेशेवर हैं तो मुझे आश्चर्य होगा कि आप अधिक आसानी से सहमत नहीं हैं (एक सच्चे यूयूओसी परिदृश्य दिया गया है)।
डेविड ड्रेगर्स

मुद्दा यह है कि मेमोरी या सीपीयू नालियां एक डेवलपर को अनुकूलित करने के लिए एकमात्र लागत नहीं हैं। मानव समय की लागत, समस्या को समझने के लिए और एक कार्यान्वयन को लिखने और डीबग करने के लिए, ट्रेडऑफ़ का भी हिस्सा हैं। यहाँ कुछ उत्तर एक निर्णय पर आधारित हैं जो मानव समय स्मृति या सीपीयू की तुलना में अधिक दुर्लभ और महंगा है। । … लेकिन यह एक चर्चा बन रही है, जो नियमों के विरुद्ध है। जवाबों पर वोट दें कि सुपर उपयोगकर्ताओं द्वारा किस परिप्रेक्ष्य का समर्थन किया जाता है।
जिम डेलाउंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.