बैश मैनुअल के अनुसार , पर्यावरण चर BASH_COMMANDमें शामिल है
कमांड को वर्तमान में निष्पादित किया जा रहा है या निष्पादित किया जा रहा है, जब तक कि शेल कमांड को ट्रैप के परिणाम के रूप में निष्पादित नहीं कर रहा है, जिस स्थिति में यह ट्रैप के समय निष्पादित कमांड है।
उस जाल कोने के मामले को एक तरफ ले जाना, अगर मैं सही ढंग से समझता हूं इसका मतलब है कि जब मैं एक कमांड निष्पादित करता हूं, तो चर BASH_COMMANDमें वह कमांड होता है। यह पूरी तरह स्पष्ट नहीं है कि क्या उस चर आदेश निष्पादन के बाद सेट नहीं होने पर (यानी, केवल avaialble है , जबकि , आदेश चल रहा है, लेकिन उसके बाद नहीं) हालांकि एक तर्क कर सकता है कि क्योंकि यह है "कमांड वर्तमान में मार डाला या जा रहा है के बारे में किए जाने की मार डाला" , यह कमांड नहीं है जिसे अभी निष्पादित किया गया था ।
लेकिन आइए देखें:
$ set | grep BASH_COMMAND=
$
खाली करें। मुझे देखने की उम्मीद होगी BASH_COMMAND='set | grep BASH_COMMAND='या शायद BASH_COMMAND='set', लेकिन खाली ने मुझे आश्चर्यचकित कर दिया।
चलो कुछ और कोशिश करते हैं:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
खैर यह समझ में आता है। मैं कमांड निष्पादित करता हूं echo $BASH_COMMANDऔर इसलिए चर BASH_COMMANDमें स्ट्रिंग शामिल है echo $BASH_COMMAND। इस बार क्यों काम किया, लेकिन पहले नहीं?
चलो setफिर बात करते हैं:
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
तो इंतज़ार करो। यह सेट किया गया था जब मैंने उस echoकमांड को निष्पादित किया था , और यह बाद में परेशान नहीं था। लेकिन जब मैंने setफिर से निष्पादित किया, तो कमांड के लिए सेट BASH_COMMAND नहीं किया गया थाset । कोई फर्क नहीं पड़ता कि मैं setयहां कितनी बार कमांड निष्पादित करता हूं , परिणाम वही रहता है। तो, निष्पादित करते समय चर सेट है echo, लेकिन निष्पादित करते समय नहीं set? चलो देखते हैं।
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
क्या? जब मैं निष्पादित किया गया था तो चर सेट किया गया था echo $BASH_COMMAND, लेकिन जब मैंने निष्पादित नहीं किया था echo Hello AskUbuntu? अब फर्क कहां है? क्या वैरिएबल केवल तब सेट होता है जब करंट कमांड ही वास्तव में शेल को मूल्यांकन करने के लिए मजबूर करता है? चलिए कुछ अलग करने की कोशिश करते हैं। हो सकता है कि कुछ बाहरी आदेश इस बार, एक बदलाव के लिए बैश बिलिन नहीं।
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
हम्म, ठीक है ... फिर से, चर सेट किया गया था। तो क्या मेरा वर्तमान अनुमान सही है? क्या चर केवल तब निर्धारित किया जाता है जब उसका मूल्यांकन करना होता है? क्यूं कर? क्यूं कर? प्रदर्शन कारणों से? चलो एक और कोशिश करते हैं। हम $BASH_COMMANDएक फ़ाइल के लिए grep करने का प्रयास करेंगे , और $BASH_COMMANDतब से एक grepकमांड सम्मिलित grepहोनी चाहिए , उस grepकमांड के लिए grep चाहिए (जैसे, अपने लिए)। तो चलो एक उपयुक्त फ़ाइल बनाते हैं:
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
ठीक है, दिलचस्प है। कमांड grep $BASH_COMMAND tmpका विस्तार हो गया grep grep $BASH_COMMAND tmp tmp(वैरिएबल का विस्तार केवल एक बार, निश्चित रूप से हो जाता है), और इसलिए मैंने grepएक बार फाइल में $BASH_COMMANDमौजूद नहीं है, और फ़ाइल में दो बार के लिए grepped किया है tmp।
Q1: क्या मेरी वर्तमान धारणा सही है:
BASH_COMMANDकेवल तभी सेट होता है जब कोई कमांड वास्तव में इसका मूल्यांकन करने की कोशिश करता है; तथा- यह एक आदेश के निष्पादन के बाद परेशान नहीं है , भले ही विवरण हमें ऐसा करने के लिए प्रेरित कर सकता है?
Q2: यदि हाँ, तो क्यों? प्रदर्शन? यदि नहीं, तो उपरोक्त आदेश अनुक्रम में व्यवहार को और कैसे समझाया जा सकता है?
Q3: अंत में, क्या ऐसा कोई परिदृश्य है जिसमें इस चर का वास्तव में सार्थक उपयोग किया जा सकता है? मैं वास्तव में इसका उपयोग करने की कोशिश कर रहा था $PROMPT_COMMANDताकि कमांड का विश्लेषण किया जा सके (और उसके आधार पर कुछ सामान किया जा सके), लेकिन मैं नहीं कर सकता, क्योंकि जैसे ही मेरे भीतर $PROMPT_COMMAND, मैं चर को देखने के लिए एक कमांड निष्पादित करता हूं , $BASH_COMMANDचर उस कमांड पर सेट हो जाता है। यहां तक कि जब मैं MYVARIABLE=$BASH_COMMANDअपनी शुरुआत में सही करता हूं $PROMPT_COMMAND, तो MYVARIABLEस्ट्रिंग शामिल होती है MYVARIABLE=$BASH_COMMAND, क्योंकि एक असाइनमेंट एक कमांड भी है। (यह सवाल इस बारे में नहीं है कि मैं एक $PROMPT_COMMANDनिष्पादन के भीतर वर्तमान कमांड कैसे प्राप्त कर सकता हूं । अन्य तरीके भी हैं, मुझे पता है।)
यह हाइजेनबर्ग के अनिश्चितता सिद्धांत के साथ थोड़ा सा है। बस चर को देखकर, मैं इसे बदल देता हूं।
bashüber- gurus हैं ।