बैश कमांड में पहले शब्द को जल्दी से कैसे बदलें?


44

मैं बैश के साथ अपने वर्कफ़्लो को थोड़ा सुधारना चाहूंगा, और मुझे लगता है कि मैं अक्सर एक ही कमांड को एक अलग निष्पादन योग्य बनाना चाहता हूं।

कुछ उदाहरण:

Git (जहाँ मैं दूसरा शब्द जल्दी बदलना चाहूँगा):

git diff     foo/bar.c
git checkout foo/bar.c

बिल्ली / आरएम (जहां केवल पहले शब्द को बदलना होगा):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

मैं जानता हूँ कि मैं हिट कर सकते हैं Ctrl+ aतो Delपहला शब्द हटाने के लिए है, लेकिन अगर वहाँ यह करने के लिए एक तेज तरीका है मैं सोच रहा हूँ।



ईमानदारी से, मुझे लगता है कि यह सिर्फ Ctrl + a और हटाने का उपयोग करने के लिए सबसे सुरक्षित है। यह निश्चित रूप से बहुत धीमा नहीं है।
agweber

जवाबों:


56

!$ अपने पिछले आदेश के अंतिम शब्द के लिए फैलता है।

तो आप कर सकते हैं:

cat foo/is/a/very/long/path/to/bar.c

rm !$

या:

git diff foo/bar.c

git checkout !$

आपके उदाहरण केवल अंतिम शब्द को दोहराने के लिए हुए, इसलिए !$ठीक काम किया। यदि आपके पास वास्तव में बहुत सारे तर्क थे, जिसे आप दोहराना चाहते थे, और आप सिर्फ पहला शब्द बदलना चाहते थे, तो आप उपयोग कर सकते थे !*, जो पिछले कमांड के सभी शब्दों को छोड़कर ज़रोथ को दर्शाता है।

bashमैन पेज का "इतिहास विस्तार" अनुभाग देखें । वहाँ लचीलापन बहुत है।


16
सही और उचित। मैं केवल एक चेतावनी देना चाहूंगा : !$आपके पास आपके द्वारा चलाए जा रहे लाइन का कोई पूर्ण दृश्य नियंत्रण नहीं है । यह कभी-कभी हानिकारक हो सकता है। विशेष रूप से यदि आप एक गलत छाप में हैं। यह historyविस्तार करने के लिए क्या से लेता है । इसलिए अगर आप शुरुआत में खाली जगह के साथ आखिरी कमांड लिखते हैं, तो शायद यह कमांड इतिहास में खत्म नहीं होगी। जब आप अपने नए कमांड को निष्पादित करेंगे !$शेल के साथ टाइप किए गए अंतिम कमांड लाइन से पैरामीटर नहीं लेंगे, लेकिन केवल इतिहास के आखिरी से। यहाँ और भी शब्द।
हथुर

1
@ हस्तूर आप टैब पर इतिहास का विस्तार करने या दुर्घटनाओं को रोकने के लिए प्रवेश कर सकते हैं।
slhck

2
@ दस्तूर इसीलिए आपको दो बार zsh (निर्लज्ज तरक्की) में इंट्रो दबाने की जरूरत है
Braiam

@ हस्तूर - जब मुझे इस बात पर कोई संदेह होता है कि क्या होने जा रहा है या मुझे यह एहसास है कि मुझे कुछ और करने से पहले कुछ और करना होगा, जिसे मैंने अभी-अभी टाइप किया है, मैं लाइन की शुरुआत में जाता हूं और एक #या अधिक जोड़ देता echo हूं। इसे देखें और यह इतिहास में चला जाता है, इसलिए मैं इसे ठीक से वापस ला सकता हूं और इसे फिर से अक्षम किए बिना उपसर्ग के बिना चला सकता हूं।
जो

28

Ctrl+ aलाइन की शुरुआत में जाने के लिए, फिर Alt+ dपहले शब्द को हटाने के लिए।


9
डिलीट शब्द शॉर्टकट वास्तव में मेटा + डी है, और मेटा को आमतौर पर लिनक्स मशीनों पर Alt में मैप किया जाता है। उन प्लेटफार्मों पर जहां यह मामला नहीं है, मेटा मॉडिफ़ायर प्राप्त करने का एक विकल्प उपसर्ग के रूप में एस्केप का उपयोग करना है। देखें en.wikipedia.org/wiki/Meta_key
गुस्तावो Giráldez

2
@ GustavoGiráldez यदि आप गहराई में जाना चाहते हैं, तो Meta+Dकेवल तभी emacsसक्षम है जब सक्षम ( set -o emacsडिफ़ॉल्ट रूप से या केवल) सक्षम है । यह अवर संपादक में काम नहीं करेगा -मोड या यदि emacsअक्षम है।
TC1

कई टर्मिनलों में (क्योंकि यह एक टर्मिनल चीज़ है और बैश चीज़ नहीं है), होम कुंजी भी एक लाइन की शुरुआत में जाएगी। कई लैपटॉप घर की चाबी के लिए Fn + Left मैप करते हैं। इसी तरह, अंतिम कुंजी आमतौर पर लाइन के अंत तक जाएगी। मैंने अभी तक एक टर्मिनल एमुलेटर का उपयोग किया है जो इन हॉटकीज़ का समर्थन नहीं करता है।
कैट

1
@ माइक दूसरी ओर, C-aऔर M-dटाइप करने के लिए बहुत तेज़ हैं यदि आपके हाथ पहले से ही टाइपिंग की स्थिति में हैं।
जंजलिन 24:15

@ मायक यह एक बाश बात है। catहोम ( ^[[Hयहां) दबाते समय और Ctrl + a ( ^A) दबाते समय आपको जो मिलता है उसे टाइप करें और तुलना करें ।
जोनास श्फर

17

मुझे यकीन नहीं है कि यह वास्तव में तेज़ होगा या नहीं, लेकिन इस लेख को देखें, विशेष रूप से # .3।

  1. ^ Str1 ^ str2 ^ का उपयोग करके पिछले कमांड से एक स्ट्रिंग बदलें

निम्नलिखित उदाहरण में, पहले हमने फ़ाइल को सत्यापित करने के लिए ls कमांड को निष्पादित किया। बाद में हमें महसूस हुआ कि हम फ़ाइल की सामग्री देखना चाहते हैं। पूरे फ़ाइल नाम को फिर से टाइप करने के बजाय, हम पिछले कमांड में "ls" को "कैट" से बदल सकते हैं जैसा कि नीचे दिखाया गया है।

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+.

यदि आपको केवल पिछली आज्ञाओं में से किसी एक के अंतिम भाग को दोहराने की आवश्यकता है जो आप उपयोग कर सकते हैं Alt+ .जो इतिहास के अंतिम पंक्ति से लिया गया अंतिम तर्क चिपकाएगा।

यदि एक से अधिक बार दबाया जाता है, तो बस लाइन के अंतिम तर्क से पहले क्या चिपकाया जाता है ...

जैसे अगर पिछले 2 कमांड थे:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

मेरे द्वारा लिखे गए शेल में rmऔर मैं दबाता हूँ Alt+ .यह दिखाई देगा:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

अगर मैं फिर से Altदबाऊं .तो + इसके बजाय दिखाई देगा

rm foo/is/a/very/long/path/to/bar.c

और इसी तरह...


यकीन नहीं क्यों, लेकिन यह मेरे मैक कंसोल पर काम नहीं करता है।
लललाला

यहां कीबोर्ड शॉर्टकट हैं जो काम करने के लिए जाने जाते हैं bash। BTW क्या आप सुनिश्चित हैं कि आप शेल के रूप में बैश का उपयोग कर रहे हैं ?
हथुर

1
मुझे लगता है कि यह एक मैक बात है। जब मुझे लगता है कि मुझे मिलता है
lulalala


12

@Jjlin जवाब के अलावा, आप निम्नलिखित युक्तियों से रूचि ले सकते हैं:

  • Ctrl+ wआपके बाएँ शब्द को हटा देता है
  • Ctrl+ kकमांड लाइन के अंत में कर्सर से हटाता है
  • Ctrl+ uकमांड लाइन की शुरुआत के लिए कर्सर से हटाता है
  • Alt+ bकर्सर को एक शब्द पीछे ले जाता है
  • Alt+ fकर्सर को एक शब्द आगे बढ़ाता है
  • $_ पिछली कमांड लाइन का अंतिम तर्क है

इनके बारे में अधिक जानकारी के लिए, मेन्यू के "रीडलाइन कमांड नाम" अनुभाग को देखें bash

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

cat foo/is/a/very/long/path/to/bar.c
rm $_

वे अच्छे सुझाव हैं, लेकिन वे इस सवाल का जवाब नहीं देते हैं।
slhck

@slhck IMHO यह इसलिए करता है क्योंकि प्रश्न शीर्षक दिए गए उदाहरणों से मेल नहीं खाता है। यदि हम उदाहरणों पर ध्यान केंद्रित करते हैं, जैसा कि मैंने किया था, तो शीर्षक होना चाहिए "बैश कमांड में किसी शब्द को जल्दी से कैसे बदलना है?" । यही कारण है कि मेरा जवाब "@jjlin" के अलावा है। लेकिन मुझे लगता है कि प्रश्न को स्पष्ट किया जाना चाहिए।
मकि

ओपी हमेशा nकमांड में पहले शब्दों को (विनिमय) हटाना चाहता है , n = 1पहले उदाहरण n = 2में और दूसरे में। jjlin का उत्तर दिखाता है कि पहले शब्द को कैसे हटाया जाए (और शॉर्टकट को फिर से लागू करके, nशब्दों को हटाएं )। आपका उत्तर कुछ बैश शॉर्टकट्स (जो वास्तव में उपयोगी हैं) को सूचीबद्ध करता है, लेकिन उनमें से कोई भी पहले nशब्दों को हटाने के लिए कुशल तरीके नहीं हैं ।
slhck

एचएम, फिर से पढ़ रहा है, $_पैरामीटर शायद काम करेगा यदि केवल एक तर्क है (यानी n = m - 1जहां mतर्क की कुल संख्या है)। शॉर्टकट के शेष भाग हालांकि सवाल के लिए अप्रासंगिक है।
slhck

@ slhck बहस करने के लिए मैंने पहला उदाहरण "दूसरा शब्द बदलें" :-)
मिकी

8

यदि आप vi में पारंगत हैं, तो आप कमांड का उपयोग करके bash (अधिकांश गोले?) में vi बाइंडिंग को सक्रिय कर सकते हैं set -o vi। फिर, आप अपने आदेश को संपादित करने के लिए सामान्य vi कुंजियों का उपयोग कर सकते हैं। अपने पहले उदाहरण में, आप ^wcw"भिन्न" को हटाने के लिए कर सकते हैं , फिर इसे चेकआउट में बदल सकते हैं।

यह केवल कमांड लाइन को संपादित करने के लिए vi कीबाइंडिंग सीखने के लायक नहीं हो सकता है, लेकिन अगर आप जानते हैं कि यह पहले से ही एक स्वच्छ उत्पादकता बूस्टर है।


मैंने kornshell पर सीखा, तो set -o viमैं कैसे रहता था! मैं अपने बैश प्रॉमिस में भी ऐसा करता हूं।
bgStack15

bindkey -vzsh के लिए। Esc 0 c w
user530873

6

इस बिल्ली की त्वचा के कई तरीके हैं!

एक विशिष्ट स्ट्रिंग को बदलने के लिए, ^old^new^extraआपकी पिछली कमांड को लेगा , oldसाथ में बदलेगा newऔर एपेंड करेगा extra। आप जैसे चाहें वैसे रुक सकते हैं; जैसे खाली स्ट्रिंग के साथ ^oldबदल जाएगा oldऔर खाली स्ट्रिंग को जोड़ देगा (अनिवार्य रूप से हटाने oldऔर अधिक कुछ नहीं करने के लिए)।

1. ^diff^checkout
2. ^cat^rm

इसका विशेष रूप से उपयोगी संस्करण:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

किसी विशिष्ट शब्द को बदलने के लिए, आप कमांड के माध्यम !m:n-pसे शब्दों को संदर्भित करने के लिए उपयोग कर सकते हैं (वर्तमान कमांड से वापस गिनने के लिए नकारात्मक संख्याओं का उपयोग करें)। आप किसी एक शब्द को संदर्भित करने के लिए भाग को छोड़ सकते हैं , और पूरे कमांड को संदर्भित करने के लिए भाग को छोड़ सकते हैं । विशेष रूपों के लिए , पिछले आदेश के अंतिम शब्द के लिए, और तर्क (सभी लेकिन शब्द के लिए पिछला आदेश की) बहुत उपयोगी होते हैं।npm-p:m-p!!!-1!$!*0

1. !!:0 checkout !!:2-
2. rm !*

मैं अक्सर इन दोनों का उपयोग करता हूं; zsh यहाँ विशेष रूप से अच्छा है, क्योंकि टैब हिट करने से यह सुनिश्चित हो जाएगा कि आप इसे सही समझ गए हैं।

लाइन संपादन के साथ ऐसा करने के कई तरीके भी हैं। अपने खोल की चाबियों पर पढ़ें।


-2

अधिकांश टर्मिनल प्रोग्राम समर्थन करते हैं ...

  • <Up-Arrow>इतिहास से पिछली कमांड लाइनों में से एक को फिर से परिभाषित करने के लिए आवश्यकतानुसार दबाएं ।
    • <Down-Arrow>इतिहास सूची के माध्यम से आगे बढ़ने के लिए आवश्यक के रूप में दबाएं ।
  • <Left-Arrow>कर्सर को दूसरे शब्द के अंत में ले जाने के लिए आवश्यकतानुसार दबाएं ।
  • <Backspace>दूसरा शब्द मिटाने के लिए आवश्यकतानुसार दबाएँ ।
  • प्रतिस्थापन दूसरे शब्द में टाइप करें।
    • अधिक बदलावों के लिए रिपोजिशन करने के लिए प्रेस <Right-Arrow>/ <Left-Arrow>आवश्यकतानुसार।
  • <RETURN>कमांड निष्पादित करने के लिए मारो

यदि आप जो कमांड लाइन चाहते हैं, वह हाल ही में नहीं थी, तो <Ctrl-r>सवाल में बताए अनुसार रिवर्स-आई-सर्च करें ...
क्या bash में कमांड का हिस्सा टाइप करने के बाद ctrl-r का उपयोग करने का कोई तरीका है?
फिर आवश्यकतानुसार तीर कुंजी के माध्यम से संपादित करें।


-3

मैं क्या करता हूं (Ubuntu / bash):

1) Arrow upपिछली कमांड को वापस करने के लिए हे
2) Homeशुरुआत की ओर लौटने के लिए
3) चाबी को आवश्यकतानुसार संशोधित करें।

इडियट-प्रूफ और विशेष रूप से मल्टी-लाइन कमांड के लिए उपयोगी।

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