बैश इतिहास बहुत शक्तिशाली है। बैश इतिहास विस्तार का प्रभावी ढंग से उपयोग करने के तरीके को समझना आपको Linux कमांड लाइन पर अत्यधिक उत्पादक बना देगा।
यह लेख 15 उदाहरणों की व्याख्या करता है जो निम्नलिखित बैश इतिहास विस्तार सुविधाओं का उपयोग करते हैं:
- इवेंट डिज़ाइनर - इतिहास में किसी विशेष कमांड को संदर्भित करता है। यह एक से शुरू होता है!
- वर्ड डिज़ाइनर - इतिहास प्रविष्टि के किसी विशेष शब्द को संदर्भित करता है। आम तौर पर यह एक समान डिज़ाइनर के साथ संयुक्त हो जाता है। यहां तक कि डिज़ाइनर और शब्द डिज़ाइनर भी एक कोलन द्वारा अलग किए जाते हैं
- संशोधक - घटना या शब्द डिज़ाइनर द्वारा किए गए प्रतिस्थापन के परिणाम को संशोधित करता है
यह लेख हमारी चल रही बैश ट्यूटोरियल श्रृंखला का हिस्सा है।
जैसा कि आप पहले से ही जानते हैं, सभी इतिहास प्रविष्टियों को देखने के लिए, इतिहास कमांड का उपयोग करें। यह इतिहास तालिका में उस आदेश के लिए संख्या के साथ पहले निष्पादित किए गए सभी आदेशों को प्रदर्शित करेगा।
$ 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
बैश हिस्ट्री इवेंट डिज़ाइनर
<एच3>1. !n . का उपयोग करके इतिहास से एक विशिष्ट कमांड निष्पादित करेंयदि आपने पहले किसी कमांड को निष्पादित किया है, तो उसे फिर से टाइप करने के बजाय, आप इतिहास में कमांड की संबंधित संख्या का उपयोग करके इसे जल्दी से निष्पादित कर सकते हैं।
उदाहरण के लिए, कमांड #4 निष्पादित करने के लिए, निम्न कार्य करें। यह इतिहास से कमांड #4 प्रदर्शित करेगा, और इसे तुरंत निष्पादित करेगा।
<केंद्र> केंद्र>$ !4 service sshd restart
एक कमांड को निष्पादित करने के लिए जिसे 2 कमांड वापस टाइप किया गया था, निम्न कार्य करें।
$ !-2
पिछले कमांड को निष्पादित करने के लिए, निम्न में से कोई एक कार्य करें:
$ !! $ !-1
पिछली कमांड पर जाने के लिए आप
यदि आपने 'set -o vi' का उपयोग करके कमांड लाइन के लिए vi शैली संपादन सक्षम किया है, तो पिछली कमांड पर जाने के लिए
इतिहास से कमांड निष्पादित करने के लिए आप कीवर्ड का भी उपयोग कर सकते हैं।
निम्न उदाहरण पिछले आदेश की खोज करेगा कि कीवर्ड के साथ प्रारंभ करें "पीएस" और इसे निष्पादित करें। इस उदाहरण में, यह पिछले कमांड को उठाता है "ps -ef | grep http" और इसे निष्पादित करता है।
$ !ps ps -ef | grep http
निम्न उदाहरण पिछले आदेश की खोज करेगा जिसमें कीवर्ड शामिल है "अपाचे" और इसे निष्पादित करें। इस उदाहरण में, यह पिछले कमांड "/usr/local/apache2/bin/apachectl पुनरारंभ" को उठाता है और इसे निष्पादित करता है।
$ !?apache /usr/local/apache2/bin/apachectl restart<एच3>3. ^str1^str2^ . का उपयोग करके स्ट्रिंग को पिछले कमांड से बदलें
निम्नलिखित उदाहरण में, पहले हमने फ़ाइल को सत्यापित करने के लिए ls कमांड निष्पादित किया। बाद में हमें एहसास हुआ कि हम फ़ाइल की सामग्री देखना चाहते हैं। पूरे फ़ाइल नाम को फिर से टाइप करने के बजाय, हम पिछले कमांड में "ls" को "कैट" से बदल सकते हैं जैसा कि नीचे दिखाया गया है।
$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
नोट:अतिरिक्त बैश इतिहास युक्तियों के लिए, मास्टर लिनक्स कमांड लाइन इतिहास के लिए 15 उदाहरण देखें। यह बताता है कि इतिहास में टाइमस्टैम्प कैसे प्रदर्शित करें, और इतिहास से संबंधित विभिन्न पर्यावरण चर का उपयोग कैसे करें, जिसमें HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL और HISTIGNORE शामिल हैं
बैश हिस्ट्री वर्ड डिज़ाइनर
जब आप एक नया कमांड टाइप करना चाहते हैं, तो वर्ड डिज़ाइनर बहुत मददगार होते हैं, लेकिन पहले निष्पादित किए गए कमांड में से किसी एक से तर्क का उपयोग करें। कुछ उदाहरण नीचे दिखाए गए हैं।
<एच3>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 !!:$<एच3>6. :n . का उपयोग करके कमांड का nवां तर्क प्राप्त करें
निम्नलिखित उदाहरण में, "!tar:2" को "ls -l" कमांड के तर्क के रूप में दिया गया था। "!tar:2" इतिहास में पिछले कमांड का पता लगाता है जो "टार" से शुरू होता है और उस कमांड का दूसरा तर्क प्राप्त करता है।
$ tar cvfz /backup/home-dir-backup.tar.gz /home $ ls -l !tar:2 ls -l /backup/home-dir-backup.tar.gz<एच3>7. :* . का उपयोग करके कमांड से सभी तर्क प्राप्त करें
निम्नलिखित उदाहरण में, "!cp:*" को "ls -l" कमांड के तर्क के रूप में दिया गया था। "!cp:*" इतिहास में पिछले कमांड का पता लगाता है जो "cp" से शुरू होता है और इसके सभी तर्क प्राप्त करता है।
$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup
8. !%
. का उपयोग करके हाल ही में खोजे गए शब्द का संदर्भ लेंजैसा कि हमने ऊपर बताया, "!?अपाचे" पिछले इतिहास कमांड की खोज करेगा जिसमें "अपाचे" कीवर्ड शामिल है और इसे निष्पादित करें।
$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart
!% उस पूरे शब्द को संदर्भित करेगा जो पिछले "?" से मेल खाता था खोज.
उदाहरण के लिए, यदि आपने पहले "?apache" खोजा है, तो "!%" पूरे शब्द "/usr/local/apache2/bin/apachectl" से मेल खाएगा। ध्यान दें कि इस संदर्भ में "/" को एक शब्द के हिस्से के रूप में माना जाता है।
तो, इस मामले में, निम्नलिखित को क्रियान्वित करके, आप अपाचे को रोक सकते हैं।
$ !% 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- दूसरे तर्क से शुरू होने वाले सभी तर्क प्राप्त करता है (अंतिम तर्क को छोड़कर)।
बैश इतिहास संशोधक
संशोधक शब्द डिज़ाइनर के बाद दिए गए हैं, जैसा कि नीचे दिए गए उदाहरणों में बताया गया है।
<एच3>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<एच3>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/
. का उपयोग करजैसा कि हमने पहले चर्चा की थी, "^ मूल ^ प्रतिस्थापन ^" का उपयोग करने के बजाय, हम बैश इतिहास में एक सेड जैसे प्रतिस्थापन का भी उपयोग कर सकते हैं जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है। यह याद रखना आसान हो सकता है। !! पिछले कमांड को कॉल करना है, ":s/origin-string/replacement-string/" एक स्ट्रिंग को बदलने के लिए sed जैसा सिंटैक्स है।
$ !!:s/ls -l/cat/
जैसा कि नीचे दिखाया गया है, आप वैश्विक प्रतिस्थापन करने के लिए g ध्वज (s ध्वज के साथ) का भी उपयोग कर सकते हैं। यह तब मददगार होता है जब आपने कई शब्द गलत टाइप कर दिए हों और आप उन सभी को एक साथ बदलना चाहते हैं और फिर से कमांड निष्पादित करना चाहते हैं।
निम्नलिखित उदाहरण में, गलती से मैंने दो बार "पासवर्ड" दिया है (पासवार्ड के बजाय)।
$ cp /etc/password /backup/password.bak
इसे ठीक करने के लिए, निम्न वैश्विक इतिहास को प्रतिस्थापन की तरह करें।
$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak<एच3>14. :& . का उपयोग करके प्रतिस्थापन को शीघ्रता से दोहराएं
यदि आप पहले से ही बैश इतिहास प्रतिस्थापन को सफलतापूर्वक निष्पादित कर चुके हैं, जैसा कि ऊपर दिखाया गया है, तो आप :&का उपयोग करके उसी प्रतिस्थापन को फिर से जल्दी से दोहरा सकते हैं।
मैंने गलती से दूसरे कमांड में "पासवार्ड" के बजाय फिर से "पासवर्ड" टाइप कर दिया है।
$ tar cvf password.tar /etc/password
अब, कमांड को दोबारा टाइप करने या "जीएस/पासवर्ड/पासवार्ड" करने के बजाय, मैं केवल ":&" का उपयोग कर सकता हूं, जो अंतिम प्रतिस्थापन का पुन:उपयोग करेगा। विश्व स्तर पर अंतिम प्रतिस्थापन का पुन:उपयोग करने के लिए ":g&" का उपयोग करें।
$ !!:g& tar cvf passwd.tar /etc/passwd<एच3>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