बैश हिस्ट्री बहुत शक्तिशाली है। बैश हिस्ट्री एक्सपैंशन सुविधाओं का प्रभावी ढंग से उपयोग करने का तरीका समझना आपको Linux कमांड लाइन पर अत्यधिक उत्पादक बना देगा।
यह लेख 15 उदाहरणों की व्याख्या करता है जो निम्नलिखित बैश हिस्ट्री एक्सपैंशन सुविधाओं का उपयोग करते हैं:
- इवेंट डेजिग्नेटर्स - हिस्ट्री में एक विशेष कमांड को संदर्भित करता है। यह ! से शुरू होता है
- वर्ड डेजिग्नेटर्स - हिस्ट्री एंट्री के एक विशेष शब्द को संदर्भित करता है। आमतौर पर यह एक इवेंट डेजिग्नेटर के साथ संयुक्त होता है। इवेंट डेजिग्नेटर्स और वर्ड डेजिग्नेटर्स को कोलन द्वारा अलग किया जाता है
- मॉडिफायर्स - इवेंट या वर्ड डेजिग्नेटर्स द्वारा किए गए प्रतिस्थापन के परिणाम को संशोधित करता है
यह लेख हमारी चल रही बैश ट्यूटोरियल श्रृंखला का हिस्सा है।
जैसा कि आप पहले से ही जानते हैं, सभी हिस्ट्री एंट्री देखने के लिए, history कमांड का उपयोग करें। यह हिस्ट्री टेबल में उस कमांड की संख्या के साथ पहले निष्पादित किए गए सभी कमांड प्रदर्शित करेगा।
$ history 1 tar cvf etc.tar /etc/ 2 cp /etc/passwd /backup 3 ps -ef | grep http 4 service sshd restart 5 /usr/local/apache2/bin/apachectl restart
बैश हिस्ट्री इवेंट डेजिग्नेटर्स
1. !n का उपयोग करके हिस्ट्री से एक विशिष्ट कमांड निष्पादित करें
यदि आपने पहले कोई कमांड निष्पादित किया है, तो इसे फिर से टाइप करने के बजाय, आप हिस्ट्री में कमांड की संबंधित संख्या का उपयोग करके इसे त्वरित रूप से निष्पादित कर सकते हैं।
उदाहरण के लिए, कमांड #4 निष्पादित करने के लिए, निम्नलिखित करें। यह हिस्ट्री से कमांड #4 प्रदर्शित करेगा, और इसे तुरंत निष्पादित करेगा।
$ !4 service sshd restart
2 कमांड पीछे टाइप किए गए कमांड को निष्पादित करने के लिए, निम्नलिखित करें।
$ !-2
पिछले कमांड को निष्पादित करने के लिए, निम्न में से कोई भी करें:
$ !! $ !-1
आप पिछला कमांड प्राप्त करने के लिए <Ctrl>-P भी दबा सकते हैं (यदि आप डिफ़ॉल्ट emacs मोड में हैं)।
यदि आपने कमांड लाइन के लिए vi स्टाइल एडिटिंग सक्षम किया है 'set -o vi' का उपयोग करके, तो पिछला कमांड प्राप्त करने के लिए <Esc>-k का उपयोग करें।
2. !string और !?string का उपयोग करके कीवर्ड के साथ कमांड निष्पादित करें
आप हिस्ट्री से कमांड निष्पादित करने के लिए कीवर्ड का भी उपयोग कर सकते हैं।
निम्नलिखित उदाहरण "ps" कीवर्ड से शुरू होने वाले पिछले कमांड को खोजेगा और इसे निष्पादित करेगा। इस उदाहरण में, यह पिछले कमांड "ps -ef | grep http" को चुनता है और इसे निष्पादित करता है।
$ !ps ps -ef | grep http
निम्नलिखित उदाहरण "apache" कीवर्ड युक्त पिछले कमांड को खोजेगा और इसे निष्पादित करेगा। इस उदाहरण में, यह पिछले कमांड "/usr/local/apache2/bin/apachectl restart" को चुनता है और इसे निष्पादित करता है।
$ !?apache /usr/local/apache2/bin/apachectl restart
3. पिछले कमांड से स्ट्रिंग बदलने के लिए ^str1^str2^ का उपयोग करें
निम्नलिखित उदाहरण में, पहले हमने एक फ़ाइल वेरिफाई करने के लिए ls कमांड निष्पादित किया। बाद में हमें एहसास हुआ कि हम फ़ाइल की सामग्री देखना चाहते हैं। पूरे फ़ाइलनाम को फिर से टाइप करने के बजाय, हम पिछले कमांड में "ls" को "cat" से बदल सकते हैं जैसा कि नीचे दिखाया गया है।
$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
नोट: अतिरिक्त बैश हिस्ट्री युक्तियों के लिए, 15 Examples To Master Linux Command Line History देखें। यह बताता है कि हिस्ट्री में टाइमस्टैम्प कैसे प्रदर्शित करें, और HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL, और HISTIGNORE सहित विभिन्न हिस्ट्री-संबंधित पर्यावरण वेरिएबल का उपयोग कैसे करें।
बैश हिस्ट्री वर्ड डेजिग्नेटर्स
वर्ड डेजिग्नेटर्स बहुत उपयोगी होते हैं जब आप एक नया कमांड टाइप करना चाहते हैं, लेकिन पहले निष्पादित कमांड में से एक से आर्गुमेंट का उपयोग करना चाहते हैं। कुछ उदाहरण नीचे दिखाए गए हैं।
4. :^ का उपयोग करके कमांड का पहला आर्गुमेंट प्राप्त करें
निम्नलिखित उदाहरण में, "!cp:^" को "ls -l" कमांड के आर्गुमेंट के रूप में दिया गया था। "!cp:^" हिस्ट्री में "cp" से शुरू होने वाले पिछले कमांड का पता लगाता है और उस कमांड का पहला आर्गुमेंट प्राप्त करता है।
$ cp /etc/passwd /backup $ ls -l !cp:^ ls -l /etc/passwd
निम्नलिखित उदाहरण पिछले कमांड से पहला आर्गुमेंट प्राप्त करता है।
$ ls -l !!:^
5. :$ का उपयोग करके कमांड का अंतिम आर्गुमेंट प्राप्त करें
निम्नलिखित उदाहरण में, "!cp:$" को "ls -l" कमांड के आर्गुमेंट के रूप में दिया गया था। "!cp:$" हिस्ट्री में "cp" से शुरू होने वाले पिछले कमांड का पता लगाता है और उस कमांड का अंतिम आर्गुमेंट प्राप्त करता है।
$ cp /etc/passwd /backup $ ls -l !cp:$ ls -l /backup
निम्नलिखित उदाहरण पिछले कमांड से अंतिम आर्गुमेंट प्राप्त करता है।
$ls -l !!:$
6. :n का उपयोग करके कमांड का nth आर्गुमेंट प्राप्त करें
निम्नलिखित उदाहरण में, "!tar:2" को "ls -l" कमांड के आर्गुमेंट के रूप में दिया गया था। "!tar:2" हिस्ट्री में "tar" से शुरू होने वाले पिछले कमांड का पता लगाता है और उस कमांड का दूसरा आर्गुमेंट प्राप्त करता है।
$ tar cvfz /backup/home-dir-backup.tar.gz /home $ ls -l !tar:2 ls -l /backup/home-dir-backup.tar.gz
7. :* का उपयोग करके कमांड से सभी आर्गुमेंट प्राप्त करें
निम्नलिखित उदाहरण में, "!cp:*" को "ls -l" कमांड के आर्गुमेंट के रूप में दिया गया था। "!cp:*" हिस्ट्री में "cp" से शुरू होने वाले पिछले कमांड का पता लगाता है और इसके सभी आर्गुमेंट प्राप्त करता है।
$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup
8. !% का उपयोग करके हाल ही में खोजे गए शब्द को संदर्भित करें
जैसा कि हमने ऊपर समझाया, "!?apache" "apache" कीवर्ड युक्त पिछले हिस्ट्री कमांड को खोजेगा और इसे निष्पादित करेगा।
$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart
!% पिछले "?" खोज द्वारा मिलान किए गए पूरे शब्द को संदर्भित करेगा।
उदाहरण के लिए, यदि आपने पहले "?apache" खोजा है, तो "!%" पूरे शब्द "/usr/local/apache2/bin/apachectl" से मेल खाएगा। ध्यान दें कि इस संदर्भ में "/" को एक शब्द के हिस्से के रूप में माना जाता है।
तो, इस मामले में, निम्नलिखित निष्पादित करके, आप apache को रोक सकते हैं।
$ !% stop /usr/local/apache2/bin/apachectl stop
9. x-y का उपयोग करके कमांड से आर्गुमेंट की रेंज प्राप्त करें
निम्नलिखित उदाहरण में, "!tar:3-5" को "ls -l" कमांड के आर्गुमेंट के रूप में दिया गया था। "!tar:3-5" हिस्ट्री में "tar" से शुरू होने वाले पिछले कमांड का पता लगाता है और 3 से 5 तक के आर्गुमेंट प्राप्त करता है।
$ tar cvf home-dir.tar john jason ramesh rita $ ls -l !tar:3-5 ls -l john jason ramesh
निम्नलिखित 2 से सभी आर्गुमेंट प्राप्त करता है।
$ ls -l !tar:2-$
कृपया निम्नलिखित पर ध्यान दें:
- !!:* पिछले कमांड से सभी आर्गुमेंट प्राप्त करता है
- !!:2* दूसरे आर्गुमेंट से शुरू होने वाले सभी आर्गुमेंट प्राप्त करता है।
- !!:2-$ उपरोक्त के समान। दूसरे आर्गुमेंट से शुरू होने वाले सभी आर्गुमेंट प्राप्त करता है।
- !!:2- दूसरे आर्गुमेंट से शुरू होने वाले सभी आर्गुमेंट प्राप्त करता है (अंतिम आर्गुमेंट को छोड़कर)।
बैश हिस्ट्री मॉडिफायर्स
मॉडिफायर्स को वर्ड डेजिग्नेटर्स के बाद दिया जाता है, जैसा कि नीचे दिए गए उदाहरणों में समझाया गया है।
10. :h का उपयोग करके एक शब्द से ट्रेलिंग पाथ नाम हटाएं
निम्नलिखित उदाहरण में, "!!:$:h" पिछले कमांड का अंतिम आर्गुमेंट लेता है, और ट्रेलिंग पाथ नाम को हटा देता है। इस मामले में, यह फ़ाइलनाम को हटा देता है, और केवल पूर्ण पाथ प्राप्त करता है।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:h ls -l /very/long/path/name
11. :t का उपयोग करके एक शब्द से सभी लीडिंग पाथ नाम हटाएं
यह पिछले उदाहरण के बिल्कुल विपरीत है।
निम्नलिखित उदाहरण में, "!!:$:t" पिछले कमांड का अंतिम आर्गुमेंट लेता है, और सभी लीडिंग पाथ नामों को हटा देता है। इस मामले में, यह केवल फ़ाइलनाम प्राप्त करता है।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:t ls -l file-name.txt
12. :r का उपयोग करके एक शब्द से फ़ाइल नाम एक्सटेंशन हटाएं
निम्नलिखित उदाहरण में, "!!:$:r" पिछले कमांड का अंतिम आर्गुमेंट लेता है, और केवल ".suffix" को हटा देता है (जो यहां फ़ाइल नाम एक्सटेंशन है)। इस मामले में, इसने .txt हटा दिया।
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:r ls -l /very/long/path/name/file-name
13. :s/str1/str2/ का उपयोग करके बैश हिस्ट्री में sed जैसा प्रतिस्थापन
पहले चर्चा किए गए "^original^replacement^" का उपयोग करने के बजाय, हम बैश हिस्ट्री में sed जैसे प्रतिस्थापन का भी उपयोग कर सकते हैं जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है। इसे याद रखना आसान हो सकता है। !! पिछले कमांड को कॉल करने के लिए है, ":s/original-string/replacement-string/" स्ट्रिंग को बदलने के लिए sed-जैसा सिंटैक्स है।
$ !!:s/ls -l/cat/
आप g फ्लैग का भी उपयोग कर सकते हैं (s फ्लैग के साथ) ग्लोबल प्रतिस्थापन करने के लिए जैसा कि नीचे दिखाया गया है। यह तब उपयोगी होता है जब आपने गलती से कई शब्दों को गलत टाइप किया है और उन सभी को एक साथ बदलकर कमांड को फिर से निष्पादित करना चाहते हैं।
निम्नलिखित उदाहरण में, मैंने गलती से "password" को दो बार दिया (passwd के बजाय)।
$ cp /etc/password /backup/password.bak
इसे ठीक करने के लिए, बस निम्नलिखित ग्लोबल हिस्ट्री sed जैसे प्रतिस्थापन करें।
$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak
14. :& का उपयोग करके प्रतिस्थापन को त्वरित रूप से दोहराएं
यदि आपने पहले से ही बैश हिस्ट्री प्रतिस्थापन को सफलतापूर्वक निष्पादित किया है जैसा कि ऊपर दिखाया गया है, तो आप :& का उपयोग करके उसी प्रतिस्थापन को फिर से त्वरित रूप से दोहरा सकते हैं।
मैंने फिर से गलती से "passwd" के बजाय "password" को दूसरे कमांड में टाइप किया।
$ tar cvf password.tar /etc/password
अब, कमांड को फिर से टाइप करने के बजाय, या "gs/password/passwd" करने के बजाय, मैं बस ":&" का उपयोग कर सकता हूं, जो अंतिम प्रतिस्थापन का पुन: उपयोग करेगा। अंतिम प्रतिस्थापन को वैश्विक रूप से पुन: उपयोग करने के लिए ":g&" का उपयोग करें।
$ !!:g& tar cvf passwd.tar /etc/passwd
15. :p का उपयोग करके कमांड को निष्पादित किए बिना प्रिंट करें
यह बहुत उपयोगी है जब आप जटिल हिस्ट्री प्रतिस्थापन कर रहे हैं, और आप इसे निष्पादित करने से पहले अंतिम कमांड देखना चाहते हैं।
निम्नलिखित उदाहरण में, "!tar:3-:p", वास्तव में कमांड को निष्पादित नहीं करता है।
चूंकि हमने यहां ":p" दिया है, यह केवल प्रतिस्थापन करता है और नया कमांड प्रदर्शित करता है। एक बार जब आप बैश हिस्ट्री एक्सपैंशन वेरिफाई कर लेते हैं, और यदि आपको लगता है कि यह वह कमांड है जिसे आप चलाना चाहते थे, तो ":p" हटा दें और इसे फिर से निष्पादित करें।
$ tar cvf home-dir.tar john jason ramesh rita $ tar cvfz new-file.tar !tar:3-:p tar cvfz new-file.tar john jason ramesh