मेरे पास खराब कमांड-लाइन स्वच्छता है। जब मैं एक उपयोगी पाइपलाइन को अस्तित्व में आने का सपना देखता हूं, तो मैं शायद ही कभी इसे कहीं शेल कॉन्फ़िगरेशन के लिए प्रतिबद्ध करता हूं। इसके बजाय, जब मुझे इसकी आवश्यकता होती है, तो मैंने कुछ समय बाद 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
को तोड़ दें, इसे एक त्वरित संपादन दें, और आगे बढ़ें। बहुत कठिन नहीं है, और आप देख सकते हैं कि इसे शेल फ़ंक्शन की तरह बहुत औपचारिक रूप से क्यों करना ओवरहेड के लायक नहीं है। यह तब विशिष्ट था, इसे अब अनुकूलित करने की आवश्यकता है, और इस संदर्भ में इसका उपयोग करना "इसे मेरे इतिहास से लें और इसे बदल दें" के लिए एक बहुत अच्छा मेल है।¹
इसे इस्तेमाल करे:
Ctrl-r
को बेहतर बनाने के लिए करें)मैं स्वीकार करूंगा कि टीम की स्थिति में थोड़ा सा टूटना जैसे उदाहरण हैं। हालाँकि मैं अपने S3 ट्रैफ़िक को एक सेकंड में बढ़ा सकता हूँ, आप उस ज्ञान और क्षमता को दूसरों तक कैसे पहुँचाते हैं? डॉक्स और लिपियों के बड़े भंडार इसे हल कर सकते हैं, लेकिन इस पोस्ट में मेरा उद्देश्य इस तथ्य को घर तक पहुंचाना है कि कम घर्षण लागत और कम बाधा-से-प्रवेश लागत ही इतिहास को चमकदार बनाती है। हो सकता है कि इसे बनाने का एक अच्छा तरीका है और टीम साझा करना मिलकर काम करता है।
"कमांड-लाइन फर्स्ट वर्क" के बारे में यहां एक और पोस्ट दफन है, लेकिन यह इस बात पर जोर देने के लिए पर्याप्त है कि मुझे लगता है कि कमांड-लाइन फॉर्म में जितना हो सके उतना काम समेकित करने से बड़े लाभ होंगे। शेल इतिहास के रूप में आसानी से याद की जाने वाली क्रियाएं इंटरऑपरेबिलिटी, रिपीटेबिलिटी और बहुत कुछ जैसे कई अन्य लाभों के साथ एक लाभ हैं।
यहाँ भी प्रकाशित हो चुकी है।.