paint-brush
खराब कमांड-लाइन स्वच्छता? शैल इतिहास लोड-असर पर विचार करेंद्वारा@tylerjl
930 रीडिंग
930 रीडिंग

खराब कमांड-लाइन स्वच्छता? शैल इतिहास लोड-असर पर विचार करें

द्वारा Tyler6m2022/07/22
Read on Terminal Reader
Read this story w/o Javascript

बहुत लंबा; पढ़ने के लिए

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

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - खराब कमांड-लाइन स्वच्छता? शैल इतिहास लोड-असर पर विचार करें
Tyler HackerNoon profile picture

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


मैंने तब से फैसला किया है कि यह सबसे अच्छा तरीका है।

उस वक्तव्य को वापस ले लो, आप विचलित

नहीं! मैं वास्तव में इस पर विश्वास करता हूं। मेरे पास कारण हैं।


हमारे पेशे में एक कमांड या शेल इतिहास की धारणा एक बहुत ही कम प्रशंसनीय तंत्र है।


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


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


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


  • आह, मुझे इस वॉल्ट इंस्टेंस को खोलना होगा। मेरी अनसील चाबी फिर कहाँ थी?

    • अरे हाँ, यह बिटवर्डन में है। मैं इसे आरबीडब्ल्यू के साथ पकड़ सकता हूं:

       rbw get 'Vault Unseal Key'
  • बकवास। किस उदाहरण को बंद करने की आवश्यकता है?

    • मुझे लगता है कि मैं कौंसल से पूछ सकता हूं:

       http :8500/v1/health/state/critical
    • ओह। क्या मैं उन नोड्स को एंडपॉइंट्स की सूची के रूप में प्राप्त कर सकता हूं जिन्हें मैं किसी और चीज़ के साथ उपयोग कर सकता हूं?

       http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }'

      नोट : यह एक उप -उदाहरण है, क्योंकि मैं उस पाइपलाइन को दिल से नहीं जानता। मैं jq कमांड से शुरू करता हूं, फिर jq कमांड पर थप्पड़ मारता हूं, फिर awk फिल्टर को पुनरावृत्त करता हूं, जो कि मुझे बीच में मिलता है यह देखने के लिए जोड़े गए पाइपों के बीच कमांड चला रहा है।

  • ठीक। मुझे मेरी अनसील कुंजी और समापन बिंदु मिल गए हैं जिन्हें सील करने की आवश्यकता है। मैं उन्हें एक zsh लूप के साथ गोंद कर सकता हूं:

     http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }' \ | while read -rh do VAULT_HOST=$h vault operator unseal $(rbw get 'Vault Unseal Key') done

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


लेकिन मैं इस तरह की शॉर्ट-स्क्रिप्टिंग बहुत करता हूं। और "छोटी पाइपलाइनों की मात्रा जो मैं लिखता हूं - उन्हें अच्छी शेल स्क्रिप्ट में बदलने में लगने वाला समय और मैं सही फाइल में डालता हूं और अपने रेपो के लिए प्रतिबद्ध हूं" संख्या वास्तव में गैर-तुच्छ होगी। तो मैं इसे छोड़ देता हूँ!


मैं इसके लिए खुद को जज करता था। हालाँकि, कई वर्षों के दौरान, मैंने अपने शेल इतिहास में कहीं और एक स्क्रिप्ट में अपनी कई पाइपलाइनों को रिकॉर्ड नहीं करने के लिए खुद को जितनी बार लात मारी है, वह अस्तित्वहीन होने के लिए बहुत छोटा है।


मुझे एक बड़ा अफ़सोस हुआ: जब मैं उन्हें अपने वर्कस्टेशन पर अपने साथ नहीं ले गया। लेकिन क्या आप जानते हैं कि आपके शेल इतिहास को अपने साथ ले जाने में मदद करने के लिए विशेष रूप से डिज़ाइन किए गए टूल हैं? यह अब कोई बड़ी समस्या नहीं है!


तो क्या होता है जब आप अपने शेल इतिहास में बड़े और कभी-कभी जटिल कार्यों को लपेटते हैं, इसे अक्सर करते हैं, और अपने .shell_history को एक सुंदर, भयानक बगीचे में विकसित होने देते हैं?


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


एक उदाहरण के रूप में: मैंने लंबे समय में निम्न-स्तरीय S3 मेट्रिक्स के साथ सीधे काम नहीं किया है। लेकिन मुझे याद है कि अतीत में S3 बकेट के माध्यम से कुल ट्रैफ़िक को एकत्रित करने की आवश्यकता थी। मैं Ctrl-r aws s3 statistics <RET> टाइप करके लगभग दो सेकंड में आपके लिए उस प्रश्न का उत्तर देने के लिए कमांड ढूंढ सकता हूं:

 today="$(date +%s)" for bucket in $(aws s3 ls | awk '{ print $NF; }') do echo -n "$bucket " aws cloudwatch get-metric-statistics \ --namespace AWS/S3 \ --start-time "$(echo $today - 86400 | bc)" --end-time "$today" \ --period 86400 \ --statistics Average \ --region us-east-1 \ --metric-name BucketSizeBytes \ --dimensions Name=BucketName,Value=$bucket Name=StorageType,Value=StandardStorage \ | jq '.Datapoints[].Average' \ | gnumfmt --to=si done


यह संभवत: कुछ साल बाद इसी तरह के कार्य के लिए लिखे गए 100% का उपयोग नहीं किया जा सकता है, लेकिन उस Ctrl-x Ctrl-e को तोड़ दें, इसे एक त्वरित संपादन दें, और आगे बढ़ें। बहुत कठिन नहीं है, और आप देख सकते हैं कि इसे शेल फ़ंक्शन की तरह बहुत औपचारिक रूप से क्यों करना ओवरहेड के लायक नहीं है। यह तब विशिष्ट था, इसे अब अनुकूलित करने की आवश्यकता है, और इस संदर्भ में इसका उपयोग करना "इसे मेरे इतिहास से लें और इसे बदल दें" के लिए एक बहुत अच्छा मेल है।¹

टीएल; डॉ

इसे इस्तेमाल करे:


  • बहुत सारे इतिहास को बनाए रखने के लिए अपने शेल इतिहास सेटअप में बदलाव करें। हो सकता है कि आप जहां भी जाएं, इसे अपने साथ लाने के लिए एटूइन जैसा कुछ भी सेटअप करें (या कम से कम fzf के इतिहास एकीकरण का उपयोग अपने Ctrl-r को बेहतर बनाने के लिए करें)
  • जहाँ आप कर सकते हैं, स्व-निहित शेल कमांड के भीतर कार्यों या कार्य की इकाइयों को व्यक्त करने का प्रयास करें। ² इसका अर्थ है लंबे और अधिक कड़े-एक साथ शेल कमांड, लेकिन यह ठीक है! आपका लक्ष्य धीरे-धीरे छोटे कार्यक्रमों का एक पुस्तकालय जमा करना है जो आपके किसी भी कार्य को बदल सकता है जो अन्यथा मैनुअल हो सकता है।
  • जब आप कुछ कीस्ट्रोक्स के साथ कुछ कठिन या जटिल काम करने वाले कमांड का पुन: उपयोग कर सकते हैं, तो आपका भविष्य स्वयं वर्तमान-स्वयं को धन्यवाद देगा।

फुटनोट

मैं स्वीकार करूंगा कि टीम की स्थिति में थोड़ा सा टूटना जैसे उदाहरण हैं। हालाँकि मैं अपने S3 ट्रैफ़िक को एक सेकंड में बढ़ा सकता हूँ, आप उस ज्ञान और क्षमता को दूसरों तक कैसे पहुँचाते हैं? डॉक्स और लिपियों के बड़े भंडार इसे हल कर सकते हैं, लेकिन इस पोस्ट में मेरा उद्देश्य इस तथ्य को घर तक पहुंचाना है कि कम घर्षण लागत और कम बाधा-से-प्रवेश लागत ही इतिहास को चमकदार बनाती है। हो सकता है कि इसे बनाने का एक अच्छा तरीका है और टीम साझा करना मिलकर काम करता है।


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


यहाँ भी प्रकाशित हो चुकी है।.