इस लाइन में .bashrc की वजह से बैश की शुरुआत धीमी है। इसका क्या कारण हो सकता है?


19

मेरी .bashrcफ़ाइल में इस आशय की एक पंक्ति है:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

जब मैं इस लाइन पर टिप्पणी करता हूं, तो नया टर्मिनल खोलने पर बैश लगभग तुरंत शुरू हो जाता है। इस पंक्ति के साथ, मेरे कर्सर के प्रदर्शित होने से पहले 4-5 सेकंड की देरी है।

नेस्टेड कमांड $(pwd)आदि को हटाने से इसे फिर से गति मिलती है। ये क्यों हो रहा है? क्या मैं अभी भी किसी तरह नेस्टेड कमांड का उपयोग कर सकता हूं?


4
समस्या findकमांड है, जो बूट समय पर निष्पादित होती है और निर्देशिका संरचना के आधार पर निष्पादित करने में लंबा समय ले सकती है। यदि आप सिंगल-का उपयोग करते हैं, तो डबल-कोट्स के बजाय, findरन टाइम पर निष्पादित किया जाएगा, जब aliasइसे लागू किया जाता है। यह इस बात पर निर्भर करता है कि आप किस वर्किंग डायरेक्टरी का उपयोग करना चाहते हैं, वह घोषणा के समय या वर्तमान समय में है। वैसे $(pwd)व्यक्त करने के लिए एक नहीं बल्कि अक्षम तरीका है .या $PWD
AFH

15
मुझे पता है कि आप क्या पूछ रहे हैं, लेकिन यह एक XY समस्या की तरह लग रहा है । आपको स्क्रिप्ट का उपयोग करने की आवश्यकता क्यों है find? एक बार जब आप इसे स्थापित करते हैं, तो आप जानते हैं कि यह कहां है। यहां तक ​​कि अगर आप इसे बार-बार अपडेट करते हैं और इसका नाम बदलते हैं, तो आप इसे एक प्रतीकात्मक लिंक बनाए रख सकते हैं, इसलिए यह हमेशा एक निश्चित नाम के तहत उपलब्ध है।
सिल्क्स'

5
@AFH कृपया जवाब के रूप में उत्तर पोस्ट करें, टिप्पणी नहीं।
डेविड रिचेर्बी

1
@DavidRicherby - मैं यह सुनिश्चित करना चाहता था कि पोस्ट करने से पहले यह वास्तव में जवाब था। मुझे आश्चर्य हुआ कि स्क्रिप्ट एक अनियंत्रित निर्देशिका के भीतर मिली फाइलों पर काम करेगी।
AFH

जवाबों:


45

क्योंकि कमांड प्रतिस्थापन डबल-कोट्स के अंदर है, इसका मूल्यांकन उस समय किया जाता है जब कमांड परिभाषित होती है। यह चलते findसमय आपकी हार्ड डिस्क सामग्री को देखने का कारण बनता .bashrcहै।

आप, इसके विपरीत, उपयोग के समय इसका मूल्यांकन करना चाहते हैं। उस स्थिति में, एकल उद्धरणों का उपयोग करें:

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

ध्यान दें कि यदि कोई भी फ़ाइल उनके नाम पर व्हाट्सएप है, तो यह उपनाम विफल हो जाएगा। इससे बचने के लिए:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

यह बाद वाला फ़ॉर्म किसी भी तरह के फ़ाइल नाम के लिए मज़बूती से काम करेगा।


1
'उपयोग का समय'। और आपकी दूसरी पंक्ति एक सब-स्पेलिंग से बचती है।
rleir

11
नकारात्मक पक्ष पर, अब हर बार जब आप टाइप करते हैं prog, findतो उसे चलाने की आवश्यकता होगी, जबकि पहले, यह केवल एक बार (शेल स्टार्टअप पर) चलाया जाएगा।
el.pescado

फिर, कैशिंग फाइल करने के कारण, दूसरी बार जब आप findइसे चलाते हैं तो यह आमतौर पर बहुत तेज होता है।
रीयरियरपोस्ट

21
@ el.pescado उल्टा, यह कल्पना करना कठिन है कि उपयोगकर्ता द्वारा लॉग की गई फ़ाइलों के बजाय मौजूद फ़ाइलों के बजाय मौजूद फ़ाइलों पर कमांड को चलाने के लिए अभिप्रेत व्यवहार है।
डेविड रिचरबी

2
@DavidRicherby हो सकता है कि यदि हम पुराना पथ मौजूद नहीं है, तो हम पथ को कैश कर सकते हैं progऔर पुनः चला सकते हैं find?
एलेक्स वोंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.