मूल रूप से, यह पिछले कमांड का अंतिम तर्क है।
!$
पिछली कमांड का "अंत" है। निम्नलिखित उदाहरण पर विचार करें: हम एक फ़ाइल में एक शब्द की तलाश करके शुरू करते हैं:
grep -i joe /some/long/directory/structure/user-lists/list-15
अगर जो उस उपयोगकर्ता सूची में है, तो हम उसे इससे हटाना चाहते हैं। हम या तो तर्क के रूप में उस लंबी निर्देशिका के पेड़ के साथ vi को आग लगा सकते हैं, या बस के रूप में vi !$
जो बैश फैलता है:
vi /some/long/directory/structure/user-lists/list-15
( स्रोत , आसान गाइड, वैसे)
यह इस !$
टोकन और विशेष शेल चर के बीच अंतर के लायक नहीं है $_
। दरअसल, दोनों पिछली कमांड के अंतिम तर्क तक विस्तार करते हैं। हालांकि, इतिहास विस्तार के!$
दौरान विस्तार किया जाता है , जबकि पैरामीटर विस्तार के$_
दौरान विस्तार किया जाता है । इसका एक महत्वपूर्ण परिणाम यह है कि जब आप उपयोग करते हैं !$
, तो विस्तारित कमांड आपके इतिहास में सहेजी जाती है।
उदाहरण के लिए, कीस्ट्रोक पर विचार करें
(केवल अक्षर बदले गए हैं $!
और $_
बीच में हैं।)
पूर्व में, जब आप दबाते हैं Up, तो कमांड लाइन पढ़ता है echo Foo Jar
, इसलिए अंतिम पंक्ति जिसे स्टडआउट लिखा जाता है Foo Jar
।
उत्तरार्द्ध में, जब आप दबाते हैं Up, तो कमांड लाइन पढ़ता है echo $_ bar
, लेकिन अब $_
पहले की तुलना में इसका एक अलग मूल्य है - वास्तव में, $_
अब है Jar
, इसलिए stdout को लिखी गई अंतिम पंक्ति है Jar Jar
।
एक और परिणाम यह है कि _
इसका उपयोग अन्य पैरामीटर विस्तार में किया जा सकता है, उदाहरण के लिए, कमांड का क्रम
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
प्रिंट करता है isomorphism isosceles
। लेकिन वहाँ कोई अनुरूप " ${!$%morphism}
" विस्तार नहीं है।
बैश में विस्तार के चरणों के बारे में अधिक जानकारी के लिए, इसका EXPANSION
अनुभाग देखें man 1 bash
(इसे कहा जाता है ऑनलाइन संस्करण में शेल विस्तार )। HISTORY EXPANSION
खंड अलग है।
echo
कुछ करने की कोशिश करने के लिए सुरक्षित है अगर आपको यकीन नहीं है कि यह क्या करेगा।