क्या इतिहास से कमांड निष्पादित करने का कोई तरीका है?


99

उदाहरण के लिए:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

मैं सोच रहा था कि अगर 636 कमांड को फिर से टाइप किए बिना निष्पादित करने का कोई तरीका है, तो बस कुछ टाइप करें और संख्या, जैसे इतिहास 636 या कुछ और।


14
क्या आप इसके बारे में जानते हैं ctrl-r?
कार्लोस कैंपड्रोस

1
हां, मुझे पता है कि लेकिन यह बिल्कुल वैसा नहीं है जैसा मैं चाहता हूं।
9

जवाबों:


170

बैश में, बस !636ठीक हो जाएगा।


12
In Linux- यह शेल (बैश, zsh, आदि) के साथ एक व्यक्ति के पास करने के लिए अधिक है, एक व्यक्ति चला रहा है तो आप जिस ओएस पर इसे चला रहे हैं। इतिहास के समर्थन के बिना लिनक्स पर गोले हैं।
18:00 पर Zoredache

@Zoredache और इसी तरह, यह विंडोज पर बैश के अधिकांश कार्यान्वयन में ठीक काम करता है।
Ajedi32

1
न केवल बैश, निश्चित रूप से, लेकिन अन्य गोले भी - सीएचएस सहित।
ड्रू

5
यदि आपको एक कमांड मिली है, जो आप चलाना चाहते हैं, तो आप :pइसे बिना चलाए कमांड को प्रिंट कर सकते हैं , !636:pउदाहरण के लिए। जिसका अर्थ है कि आप आसानी से अपने इतिहास से फिर से अप एरो दबाकर चयन कर सकते हैं और मनचाहे बदलाव कर सकते हैं
AJefferiss

78

हां, इसे "इतिहास विस्तार" कहा जाता है। देख

LESS='+/^HISTORY EXPANSION' man bash

पूरी जानकारी के लिए।

एक विस्मयादिबोधक बिंदु का उपयोग करके एक संख्या का उपयोग करना यकीनन सबसे सरल उपयोग है:

!636

हालाँकि, आप इसकी इतिहास संख्या जाने बिना सीधे अंतिम निष्पादित कमांड भी चला सकते हैं:

!!

या आप दो कमांड चला सकते हैं:

!-2

प्रपत्र, जिसका मैं अक्सर उपयोग करता हूं, हालांकि, अंतिम आदेश के अंतिम तर्क को दोहराना है:

echo this text goes into a file > /tmp/afile.txt
cat !$

या, मान लें कि मैं एक फ़ाइल का निरीक्षण कर रहा हूं। टैब पूर्णता का उपयोग करते हुए, मैं निम्नलिखित कार्य कर सकता हूं:

ls -l /really/long/path/to/some/file
less !$

फिर से, अधिक जानकारी के लिए मैन पेज पढ़ें :

LESS='+/^HISTORY EXPANSION' man bash

25
पारस्परिक रूप से, की Alt-.तुलना में अधिक सुविधाजनक हो सकता है !$। यह पिछले आदेश की अंतिम तर्क सम्मिलित करता है शब्दशः लाइन में।
ulidtko

2
@ulidtko वे विशेष दस्तावेज कहां हैं, जिनके बारे में मुझे पता था ( !$लेकिन कभी नहीं सुना था Alt-.)? क्या आप इसके लिए एक लिंक पोस्ट करेंगे, कृपया?
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc। बैश के अलावा कई प्रोग्राम लिब्रेडलाइन का उपयोग करते हैं; जो लोग करते हैं, के लिए आपको वही सुविधाएँ मिलती हैं Alt-., जैसे Ctrl-X-U(पूर्ववत करना), Ctrl-/(शॉर्टकट का वर्णन करना), टैब पूरा करना, आदि - मुफ्त में। उदाहरण के लिए, केवल एक की तीन पंक्तियों के साथ स्टॉक अजगर आरपीएलPYTHONSTARTUP में टैब पूरा करने और इतिहास को सक्षम कर सकता है । जो काम करेगा (ज्यादातर) bash में ही है, क्योंकि यह GNU Readline लाइब्रेरी है जो काम करती है। रीडलाइन के मैनपेज में सुविधाओं का विस्तार से वर्णन है।
ulidtko

2
इसके अलावा, Ctl-UpArrow (या bash पर AltUpArrow) इतिहास सूची के माध्यम से पीछे की ओर स्क्रॉल करेगा। कुछ अक्षरों को टाइप करने पर UpArrow को केवल उस अक्षर से शुरू होने वाली कमांड मिलती है, जैसे "fr (Ctl-Up)" ओपी की सूची में सभी "फ्री ..." कमांड के माध्यम से स्क्रॉल करता है। यह gnuplot & gdb जैसी चीजों में भी काम करता है जो रीडलाइन का उपयोग करते हैं।
jamesqf

2
@ Ajedi32, मेरे उत्तर में अंतिम बोल्ड लाइन देखें। :) सच कहूँ तो यह उत्तर बमुश्किल एक स्वाद है कि इतिहास विस्तार क्या कर सकता है । ध्यान रखें कि यह शेल के स्तर पर है, न कि आप जिस कमांड को बुला रहे हैं; इसलिए echo {1..5}इसके बाद केवल एक ही नहीं, बल्कि पांच फाइलें touch !$होंगी । इतनी सख्ती से यह अंतिम तर्क नहीं है, लेकिन उस लाइन पर अंतिम शेल शब्द है। (इसके बाद भी प्रयास करें ।) यदि आप इसे संपादित करने का सुझाव देने के लिए इसे और अधिक स्पष्ट रूप से स्वतंत्र महसूस करने का तरीका सोच सकते हैं। echo hello >tempecho goodbye !$
वाइल्डकार्ड

14

एक अच्छा, यदि आप पहले इतिहास नहीं चाहते हैं, तो संख्या को नोट करें, आदि:

बाश में (और शायद अन्य):

ctrl-r something 

( ctrl-r= "इंटरएक्टिव रूप से रिवर्स सर्च करें") ( something= पिछली कमांड का एक हिस्सा)

यह आपको नवीनतम इतिहास लाइन दिखाएगा something। पहले एक को पाने के लिए, ctrl-r (अकेले) को फिर से करें, हर बार इसे पिछली लाइन मिलती है।

उदाहरण के लिए:

ctrl-r  10

'10' वाली नवीनतम इतिहास लाइन दिखाने के लिए ( $10अपनी छूट के साथ लाइन में छूट के लिए), और ctrl-rजब तक आप उस इतिहास लाइन को पुनः प्राप्त नहीं कर लेते, जिसे आप खोज रहे थे

जब लाइन आप चाहते थे दिखाई देते हैं, बस Enterइसे चलाने के लिए (या आप भी संपादित कर सकते हैं, का उपयोग कर arrow keys, backspaceऔर ctrl-aपंक्ति के आरंभ में जाने के लिए, ctrl-e, अंत को पाने के लिए ctrl-k: कर्सर से पंक्ति के अंत में "मारने" के लिए (= हटाता है + इसे एक बफर में बचाता है) ctrl-y:, बहाल करने के लिए, बफर से, पहले से मारा गया बिट, आदि)

यदि आप आगे खोजना चाहते हैं (ctrl-s), तो आपको सबसे पहले XON को अक्षम करना होगा : https://stackoverflow.com/a/791800/1841533 :

"बस चलाकर XON / XOFF को निष्क्रिय करना

stty -ixon

"(और तब आप ctrl-s का उपयोग कर पाएंगे, बिना टर्मिनल को फ्रीज किए)


अगर मैं ऐसा करता हूं और अकस्मात ctrl-r को एक बार भी दबा देता हूं, तो क्या इतिहास में फिर से खोज करने का कोई तरीका है?
कैस्परद

@kasperd: हाँ आप कर सकते हैं। se पर कई जवाब यह बताते हैं: आगे की खोज के लिए ctrl-s।
ओलिवियर दुलैक

दुर्भाग्य से ctrl-s का उपयोग टर्मिनल को फ्रीज करने के लिए किया जाता है, और बैश उसे अक्षम नहीं करता है, ताकि डिफ़ॉल्ट कॉन्फ़िगरेशन में काम न करें। (अन्य कार्यक्रम - जैसे कि emacs - टर्मिनल को फ्रीज करने के लिए कीबाइंडिंग को निष्क्रिय कर देता है जैसे कि ctrl-s का उपयोग खोज के लिए किया जा सकता है।)
kasperd

@kasperd: हाँ, इस बात का उल्लेख नहीं करने के लिए खेद है (मैंने "कई उत्तरों का उल्लेख किया" क्योंकि वे सटीक करते हैं, लेकिन मैंने इसे टिप्पणी में टाइप करने या लिंक देने के लिए समय नहीं लिया ... (मैं अपने उपयोग कर रहा था) फोन)। मैं अब घर वापस आया और ऊपर दिए गए उत्तर में संपादित कर सकता हूं। bash इतिहास की खोज के लिए ctrl-s को आपको पहले स्टिक्स -ऑक्सन करने की आवश्यकता है
ओलिवियर

यह कमांड ctrl-s के सामान्य उपयोग को तोड़ने वाला है, इसलिए यह वास्तव में एक विकल्प नहीं है।
कैस्परड

7

आप शेल बिल्ट fc का उपयोग कर सकते हैं :

fc -s 636

2
यह वास्तव में स्वीकृत उत्तर से बेहतर है, लेकिन आपको -sलाभ प्राप्त करने के लिए इसे दूर करना होगा। यदि आप चलाते fc 636हैं तो आप बफ़र में अपने इतिहास से कमांड 636 के साथ एक संपादक खोलेंगे , और जब आप कमांड को सहेजेंगे और बाहर निकलेंगे (संशोधित या नहीं) चलाया जाएगा। और इससे भी बेहतर, यह एक POSIX- आज्ञाकारी है
वाइल्डकार्ड

@StevenPenny धन्यवाद। और हाँ, मुझे पता है कि POSIX क्या है, हालाँकि मुझे इसकी प्रासंगिकता दिखाई नहीं देती है। भले ही, कुछ आसानी से पहुंच और शामिल प्रलेखन अच्छा होगा।
फहीम मीठा

@FaheemMitha "मदद fc" चलाने का प्रयास करें।
वाइल्डकार्ड

@Wildcard helpPOSIX नहीं है - ऐसा करना पड़ सकता है man dashया समान
स्टीवन पेनी

@Ildcard धन्यवाद। मैं भूल जाता हूं कि helpमौजूद है। एक और शेल बिलिन। और अवांछित उपयोगकर्ताओं के लिए हैरान करना जो एक नई प्रणाली के साथ मदद करना चाहते हैं, लेकिन इसके बजाय अस्पष्ट की एक धारा के साथ सामना कर रहे हैं। :-(
फहीम मीठा

3

नहीं है HSTR- hhके लिए आदेश bashऔर zshइंटरैक्टिव कमांड चयन, बेहतर Ctrl-R रिवर्स खोज:

hh इंटरैक्टिव इतिहास कमांड उदाहरण

इसके इंटरैक्टिव, ताकि आप इसे निष्पादित करने से पहले कमांड को खोज और संपादित कर सकें।

उबंटू पर, आप hhनिम्नलिखित एक-लाइनर के साथ स्थापित कर सकते हैं:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

या कदम से कदम:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

hhफेडोरा, आरएचईएल या सेंटोस पर स्थापित करें :

sudo dnf|yum install hstr -y

के साथ macOS पर homebrew:

brew install hh

... इसके बाद इसे कॉन्फ़िगर करें:

hh --show-configuration >> ~/.bashrc

यह डिफ़ॉल्ट Ctrl-R व्यवहार को बदल देगा।

hh --show-configurationयह निर्धारित करने के लिए चलाएँ कि आपके बैश प्रोफ़ाइल में क्या जोड़ा जाएगा।

Github पर प्रोजेक्ट होमपेज पर अधिक कॉन्फ़िगरेशन विकल्प उपलब्ध हैं: https://github.com/dvorka/hstr

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