बश में विस्मयादिबोधक चिह्न (!) को समझना


108

मैंनें इस्तेमाल किया

history | less

पिछले आदेशों की पंक्तियों को प्राप्त करने के लिए और बाईं ओर की संख्याओं से मुझे वह पंक्ति मिली जिसे मैं बार-बार चाहता था (जैसे। 22) और किया।

!22

कमांड प्रॉम्प्ट पर और यह काम किया - उस समय मेरे द्वारा किए गए लाइन पर कमांड के सेट को निष्पादित करना। मैं यह नहीं पता लगा सकता कि विस्मयादिबोधक चिह्न का उपयोग कहाँ किया जाता है, यह क्या करता है, जो कार्य द्वारा किए गए कार्यों के संदर्भ में प्रस्तुत करता है, और इसका उपयोग कहाँ करना है। दस्तावेज़ीकरण से मुझे एक स्पष्टीकरण नहीं दिखता है जो 'मूर्त' है।


6
इस उत्तर मदद कर सकता है
माइकल Mrozek

9
आपके प्रश्न का उत्तर नहीं है, लेकिन <ctrl> + R आपको अंतःक्रियात्मक रूप से अपने इतिहास को खोजने और फिर तुरंत निष्पादित करने की अनुमति देगा यदि आप जो खोज रहे थे वह मिल जाए।
kasterma

जवाबों:


144

!एक ऐसी विशेषता है जो मूल रूप से सी शेल में दिखाई देती है , तीर कुंजियाँ रखने के लिए टर्मिनलों पर भरोसा करने से पहले। यह विशेष रूप से उपयोगी है यदि आप वर्तमान कमांड संख्या को प्रॉम्प्ट ( PS1="\!$ ") में जोड़ते हैं ताकि आप पिछले आदेशों के लिए नंबर प्राप्त करने के लिए जल्दी से अपनी स्क्रीन पर देख सकें।

अब जब आप एरो कीज़ का उपयोग कर सकते हैं और Ctrl-Rकमांड हिस्ट्री को खोजना पसंद करते हैं, तो मुझे फीचर का ज्यादा उपयोग नहीं दिखता।

इसका एक संस्करण आपको अभी भी उपयोगी लग सकता है !!, जो पिछली कमांड को फिर से निष्पादित करता है। अपने दम पर, मैं !!Enterकिसी भी तेजी से बस की तुलना में नहीं मिल रहा है Enter, लेकिन जब एक बड़ी कमांड में संयुक्त मददगार हो सकता है।

उदाहरण: आधारित सिस्टम पर एक सामान्य पायलट त्रुटि एक कमांड पर उपसर्ग sudoको भूलना है sudoजिसके लिए अतिरिक्त विशेषाधिकार की आवश्यकता होती है। एक नौसिखिया पूरे कमान को फिर से देखता है। मेहनती छात्र शेल के कमांड इतिहास से कमांड को संपादित करता है। प्रबुद्ध एक प्रकार का sudo !!

बैश आपको !शेल के साथ प्रसंस्करण को अक्षम करने देता है set +o histexpandया set +H। आप इसे Zsh के साथ अक्षम कर सकते हैं set -K


4
मुझे लगता है कि Ctrl-P Ctrl-J बहुत तेज़ है; ऊपर से कम से कम दर्ज करें।
ईपी

24
यदि आप अंतिम कमांड को चलाना चाहते हैं, तो Up / Enter ठीक है, लेकिन यदि आप इसे किसी तरह से जोड़ना चाहते हैं (कहते हैं, आप भूल गए sudo, या कुछ), तो आप sudo !!उदाहरण के लिए कर सकते हैं । यह "अप / Ctrl-A (या होम, यदि आप पर्याप्त भाग्यशाली हैं) / sudo / space / enter" की तुलना में थोड़ा तेज़ हो सकता है। YMMV। :)

1
@AquariusPower: बस इसे उद्धृत करें। या तो echo 'Hi!'या echo "Hi!"या echo Hi\!। सभी एक ही काम करते हैं।
वारेन यंग

1
setopt NO_BANG_HISTzsh में की तुलना में अधिक यादगार हो सकता है -K
ग्रेगरी

48

अगर अब यहाँ कोई जवाब नहीं है, तो सुपर यूजर पर निश्चित रूप से एक है, क्योंकि मैंने हाल ही में एक पढ़ा है। में बैश आदमी पेज आप एक विशाल नामक अनुभाग पा सकते हैं इतिहास विस्तार मामले पर।

आप केवल अंतिम कमांड को चलाने से अधिक पूरे होस्ट कर सकते हैं, या कमांड संख्या X। आप !catअंतिम कमांड को चलाने की तरह काम कर सकते हैं जो इसके साथ शुरू हुआ था cat। या !?bash?:s/bash/csh/युक्त अंतिम कमांड चलाता है, bashलेकिन इसके साथ बदल देता है csh


3
हालांकि सीधे ओपी के सवाल का जवाब नहीं है, लेकिन इस तरह से अधिक उत्थान की जरूरत है। इतना उपयोगी! धन्यवाद, हॉक।
19

उह, मुझे गोग्लिंग शुरू करने से पहले वास्तव में मैन पेज देखना चाहिए।
erikbwork

1
!!:s/bash/csh/वास्तव में अंतिम कमांड चलाता है , फिर csh के साथ बैश की जगह, यदि मौजूद है। आखिरी कमांड नहीं जिसमें बैश शामिल है। यही कारण है कि हो सकता है !?bash?:s/bash/csh/हो सकता है या!?bash?:s/%/csh/
सीडीई

कई वर्षों के लिए बैश का बड़े पैमाने पर उपयोग करने के बाद, मुझे यह जानकर धक्का लगा कि मुझे इस कीवर्ड के बारे में पहले कभी पता नहीं चला था, और भले ही मैंने manपेजों के माध्यम से घंटे बिताए हों , यह सुविधा अविश्वसनीय रूप से अस्पष्ट है। संबंधित अनुभाग को इंगित करने के लिए धन्यवाद - यह वास्तविक डॉक्स में एकमात्र स्थान है जहां वे इसे पर्याप्त रूप से समझाते हैं।
स्टीव बेनर

39

बहुत कुछ !इस तरह किया जा सकता है :

  • एक कमांड निष्पादित करें जो 3 कमांड से पहले टाइप की गई है: !-3
  • उस कमांड को निष्पादित करें जो इसके साथ शुरू होती है !ls

और भी काफी। 15 लिनक्स बैश इतिहास विस्तार के उदाहरण देखें जिन्हें आपको जानना चाहिए


इसे अपडाउन किया। अन्य किसी भी उत्तर में इन चालाक चालों में से कोई भी नहीं था।
गगनचुंबी लुकासी

अपवित्र क्योंकि www.thegeekstuff.com बस एक शानदार संसाधन है, और यह उन कुछ लिनक्स लेखों में से एक था जिन्हें मैंने पहले नहीं देखा था। बहुत उपयोगी।
स्टीव बेनर

4

मेरे एक मित्र ने मुझे यह ईमेल किया:

यह GNU इतिहास पुस्तकालय का हिस्सा है। बैश में इसका उपयोग आपके इतिहास में आदेशों को फिर से चलाने के लिए किया जाता है। यदि आप कट्टर होना चाहते हैं, तो कार्यान्वयन विवरण के लिए bash-4.1 / lib / readline / histexpand.c में history_expansion_char के लिए grep।


3

बेशक आप !!बैश शेल में अंतिम कमांड का पुन: उपयोग कर सकते हैं । और फिर !$आपके अंतिम आदेश के अंतिम भाग का पुन: उपयोग करना है।

उदाहरण के लिए कुछ फ़ाइल देखें

less path/to/your/file.txt

यदि आप अब उसी फ़ाइल को संपादित करना चाहते हैं, तो आप !$अंतिम कमांड से केवल फ़ाइल पथ प्राप्त करने के लिए उपयोग कर सकते हैं

vim !$

1
आह, मैं इसे खोजने की उम्मीद कर रहा था। यह दो args के साथ कैसे व्यवहार करता है?
जोनाथन

यह सिर्फ दो के अंतिम तर्क का पुन: उपयोग करेगा। $touch f1 f2और फिर $vim !$मूल्यांकन करेंगे$vim f2
टशन शानुका जे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.