$ का क्या मतलब है?


32

मैं एक ट्यूटोरियल के माध्यम से अनुसरण कर रहा हूं और इस कमांड को चलाने का उल्लेख करता हूं:

sudo chmod 700 !$

मैं परिचित नहीं हूं !$। इसका क्या मतलब है?


5
यह आम तौर पर echoकुछ करने की कोशिश करने के लिए सुरक्षित है अगर आपको यकीन नहीं है कि यह क्या करेगा।
शादुर

8
@ बहादुर, हमेशा नहीं। echo $(rm -rf /)
cjm

1
@cjm जब तक आप वास्तव में पुरानी प्रणाली पर नहीं होते हैं, तब आपको --no-preserve-rootविकल्प की आवश्यकता होगी , और यदि आप किसी प्रोग्राम में "नो प्रिजर्व" शब्दों को देखते हैं तो आप बेहतर सोचते हैं कि यह क्या करता है।
wchargin

4
@Chargin यह मानते हुए बहुत सावधान रहें कि "वास्तव में पुराना" और "लिनक्स / जीएनयू कोर्यूटिल्स का उपयोग नहीं करना" एक ही बात है; वे नहीं हैं
क्रिस डाउन

जवाबों:


44

मूल रूप से, यह पिछले कमांड का अंतिम तर्क है।

!$पिछली कमांड का "अंत" है। निम्नलिखित उदाहरण पर विचार करें: हम एक फ़ाइल में एक शब्द की तलाश करके शुरू करते हैं:

grep -i joe /some/long/directory/structure/user-lists/list-15

अगर जो उस उपयोगकर्ता सूची में है, तो हम उसे इससे हटाना चाहते हैं। हम या तो तर्क के रूप में उस लंबी निर्देशिका के पेड़ के साथ vi को आग लगा सकते हैं, या बस के रूप में vi !$जो बैश फैलता है:

vi /some/long/directory/structure/user-lists/list-15

( स्रोत , आसान गाइड, वैसे)


यह इस !$टोकन और विशेष शेल चर के बीच अंतर के लायक नहीं है $_। दरअसल, दोनों पिछली कमांड के अंतिम तर्क तक विस्तार करते हैं। हालांकि, इतिहास विस्तार के!$ दौरान विस्तार किया जाता है , जबकि पैरामीटर विस्तार के$_ दौरान विस्तार किया जाता है । इसका एक महत्वपूर्ण परिणाम यह है कि जब आप उपयोग करते हैं !$, तो विस्तारित कमांड आपके इतिहास में सहेजी जाती है।

उदाहरण के लिए, कीस्ट्रोक पर विचार करें

  • echo Foo Enter echo !$ Jar Enter Up Enter; तथा

  • echo Foo Enter echo $_ Jar Enter Up Enter

(केवल अक्षर बदले गए हैं $!और $_बीच में हैं।)

पूर्व में, जब आप दबाते हैं 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खंड अलग है।


6
अच्छा लगा। जानकार अच्छा लगा। इसके अलावा, अच्छी बात यह है कि स्टैक एक्सचेंज है। Google को कुछ इस तरह खोजना मुश्किल है!$
एंड्रयू

4
BTW, कमांड लाइन पर, आप पिछली कमांड के अंतिम तर्क को insert-last-argumentआमतौर पर बाध्य कर सकते हैं M-.
चोरोबा

1
@ और कृपया इसे स्वीकार करने के लिए याद रखें यदि यह आपके प्रश्न का उत्तर देता है। टिप्पणियों को पोस्ट करने के बजाय स्वीकार करना और उत्थान करना एसई नेटवर्क पर धन्यवाद कैसे व्यक्त किया जाता है, "आधिकारिक" रुख के लिए यहां देखें ।
terdon

1
@Andrew FYI करें, मैंने Google को "बैश बैंग डॉलर" के लिए खोजा और अच्छे परिणाम मिले, जिसमें तीसरी सूची के रूप में यह लिंक भी शामिल है।
wchargin

1
@terdon मैंने पिछली रात उत्तर को स्वीकार करने की कोशिश की, लेकिन यह इतना तेज़ था कि मुझे इसे स्वीकार करने के लिए इंतजार करने के लिए मजबूर होना पड़ा।
एंड्रयू

4

सख्ती से बोलना !$इतिहास की सूची से अंतिम आदेश का अंतिम शब्द है।

शब्द - अक्षरों के एक क्रम को शेल द्वारा एक इकाई के रूप में माना जाता है। शब्दों में अयोग्य रूपी मेटाचैकर शामिल नहीं हो सकते हैं।

मेटाचैकर - एक चरित्र, जब अयोग्य, शब्दों को अलग करता है। एक मेटाचैकर एक रिक्त या निम्न वर्णों में से एक है: '|', '&', ';', '(', ')', '<', या '>'

रिक्त - एक स्थान या टैब वर्ण।

उदाहरण:

set -o history # enable command history
set -o histexpand # enable ! style history substitution

HISTSIZE=10

# save all lines on the history list    
HISTCONTROL=
HISTIGNORE=

date
echo !$ # prints date

date>/dev/null
echo !$ # prints /dev/null

echo a b c>/dev/null
echo !$ # prints /dev/null

HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
 echo d e f # space at the beginning
echo !$ # prints c


-3

!$ आपको अंतिम आदेश उस विशेष उपयोगकर्ता के लिए उपयोग किया जाएगा ...

आप पहले उपयोग किए गए आदेशों का इतिहास भी पा सकते हैं history कमांड ... इसे आज़माएं ...।

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


1
अन्य उत्तर सही हैं। यह एक गलत है।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.