$ _ बनाम! $। पूर्ववर्ती आदेश और आउटपुट पुनर्निर्देशन का अंतिम तर्क


28

प्रश्न विशेष चर के बारे में है। प्रलेखन कहता है:

!!:$

पूर्ववर्ती आदेश का अंतिम तर्क निर्दिष्ट करता है । यह छोटा हो सकता है! $।


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

कुछ अंतर होना चाहिए क्योंकि मैं पकड़ नहीं सकता, क्योंकि:

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

अंतर क्या है?


4
! $ $ $ $ $ $ $ $ $ $ $ इतिहास विस्तार, एक विशेष चर नहीं, इसलिए मैं मान लूंगा कि bash कोड उन्हें अलग तरीके से संभालता है।
जेफ स्कालर

2
मैं इस सवाल का एक निश्चित जवाब नहीं है है, लेकिन: ① बॉर्न शैल भाषा में से एक है, शायद है आज भी व्यापक रूप में प्रयोग किया जाता, कम से कम आंतरिक रूप से संगत प्रोग्रामिंग भाषा। सामान्य सिद्धांतों को कम करने का प्रयास आपको कहीं नहीं मिलेगा। आपको बस सभी विशेष नियमों को याद रखना है। माफ़ कीजिये। "" विस्तार के बाद "शब्दों को नोट करें, जिस वाक्यांश के बाद आपने हाइलाइट किया था, उसकी परिभाषा में । यह महत्वपूर्ण है। यह अंतर नहीं समझा सकता है कि आप पहेलियाँ लेकिन यह अन्य तरीकों का एक गुच्छा समझाता है और समान नहीं हैं। $_$_!$
zwol

जवाबों:


32

!$इतिहास विस्तार का एक शब्द रचनाकार है, यह इतिहास में पिछले आदेश के अंतिम शब्द तक फैला है । IOW, इतिहास में पिछली प्रविष्टि का अंतिम शब्द। यह शब्द आमतौर पर कमांड के लिए अंतिम तर्क है, लेकिन पुनर्निर्देशन के मामले में नहीं। में:

echo "hello" > /tmp/a.txt

पूरा कमांड 'echo "hello" > /tmp/a.txt'इतिहास में दिखाई दिया, और /tmp/a.txtउस कमांड का अंतिम शब्द है।

_एक शेल पैरामीटर है, यह पिछले कमांड के अंतिम तर्क तक फैलता है। यहां, पुनर्निर्देशन कमांड को पारित किए गए तर्कों का हिस्सा नहीं है, इसलिए केवल helloतर्क को पारित किया गया है echo। इसलिए $_इसका विस्तार किया गया hello

_से एक नहीं है खोल मानक विशेष मापदंडों अब। यह काम करता है bash, zsh, mkshऔर dashकेवल जब इंटरैक्टिव, ksh93केवल जब दो आदेश अलग तर्ज पर कर रहे हैं:

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1

1
!$विस्तार बनाम $_पैरामीटर का एक प्रभाव यह है कि echo $_हमेशा इतिहास में जैसा दिखता है echo $_, जबकि echo !$उस मूल्य को दिखाता है जिसे इसका विस्तार किया गया था। उदाहरण के लिए echo one twoतो echo !$है, तो पता चलता है ऊपर दबाने echo two
जैकटोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.