पिछली कमांड से तर्कों का उपयोग कैसे करें?


287

मुझे पता है कि Esc+ .आपको अंतिम आदेश का अंतिम तर्क देता है।

लेकिन मैं आखिरी कमांड के पहले तर्क में दिलचस्पी रखता हूं। क्या ऐसा करने के लिए एक महत्वपूर्ण बंधन है?

उसी तर्ज पर, क्या अंतिम कमांड से nth तर्क प्राप्त करने का एक सामान्य तरीका है? मुझे पता है कि एक बैश स्क्रिप्ट में, आप उपयोग कर सकते हैं $0, $1आदि, लेकिन ये कमांडलाइन पर काम नहीं करते हैं।

इसके अलावा, पिछली आज्ञाओं के 0 वें तर्क के माध्यम से पुनरावृत्ति के बारे में क्या, जैसे कि हम लगातार दबाकर अंतिम तर्क के साथ कर सकते हैं Esc+ .?

जवाबों:


284

जिस तरह M-.(मेटा-डॉट या एस्क-डॉट या अल्ट-डॉट) रीडलाइन फ़ंक्शन है yank-last-arg, M-C-y(मेटा-कंट्रोल-वाई या एस्क-सीटीएमएल -वाई या सीटीएल-एल्ट-वाई) रीडलाइन फ़ंक्शन है yank-nth-arg। निर्दिष्ट किए बिना n, यह पिछले कमांड का पहला तर्क देता है।

एक तर्क निर्दिष्ट करने के लिए, एस्केप और एक नंबर दबाएं या Alt दबाए रखें और एक नंबर दबाएं। आप कर सकते हैं Alt- -एक नकारात्मक संख्या निर्दिष्ट करने के लिए फिर Alt जारी करें और अंक दबाएं (यह तर्क की सूची के अंत से गिना जाएगा।

उदाहरण:

निम्नलिखित कमांड दर्ज करें

$ echo a b c d e f g
a b c d e f g

अब अगले प्रॉम्प्ट पर, echo(निम्न स्थान के साथ) टाइप करें , फिर

प्रेस Alt- Ctrl- yऔर अब आप देख सकते हैं:

$ echo a

Enterअभी तक दबाए बिना , निम्न कार्य करें

प्रेस Alt- 3 Alt- Ctrl-y

प्रेस Alt- - 2 Alt- Ctrl-y

अब आप देखेंगे:

$ echo ace

वैसे, आप echoतर्क 0 का चयन करके लाइन पर रख सकते थे :

प्रेस Alt- 0 Alt- Ctrl-y

संपादित करें:

आपके मूल में जोड़े गए प्रश्न का उत्तर देने के लिए:

आप दबा सकते हैं Alt- 0फिर बार-बार दबा सकते हैं Alt- .पिछले आदेशों के माध्यम से कदम उठाने के लिए (arg 0)। इसी तरह Alt- -फिर दोहराना Alt- .आप पिछले अगले-से-अंतिम तर्क के माध्यम से कदम रखने की अनुमति देगा।

यदि इतिहास में किसी विशेष पंक्ति पर कोई उपयुक्त तर्क नहीं है, तो घंटी बज जाएगी।

यदि कोई विशेष संयोजन है जिसे आप अक्सर उपयोग करते हैं, तो आप एक मैक्रो को परिभाषित कर सकते हैं ताकि एक कीस्ट्रोक इसे निष्पादित करेगा। यह उदाहरण पिछले कमांड के दूसरे तर्क को दबाकर याद करेगा Alt- Shift- Y। आप इस के बजाय किसी भी उपलब्ध कीस्ट्रोक को चुन सकते हैं। आप पिछले वाले के माध्यम से कदम रखने के लिए इसे बार-बार दबा सकते हैं।

इसे आज़माने के लिए, बैश प्रॉम्प्ट पर मैक्रो डालें:

bind '"\eY": "\e2\e."'

इसे लगातार बनाए रखने के लिए, इस लाइन को अपनी ~/.inputrcफ़ाइल में जोड़ें :

"\eY": "\e2\e."

दुर्भाग्य से, यह arg 0 या नकारात्मक तर्क संख्या के लिए काम नहीं करता है।


14
जब बैश / रीडलाइन के लिए कीबोर्ड शॉर्टकट की तलाश की जाती है, तो मुझे bind -lpचालू बाइंडिंग को देखना और देखना पसंद है ।
चाड स्केटर

1
@ChadSkeeters: और -s(Bash 4 में नया) मैक्रो का उपयोग करके बनाई गई सूचियों को सूचीबद्ध करता है -x
अगली सूचना तक रोक दिया गया।

ध्यान दें कि आप अंकों के तर्क का भी उपयोग कर सकते हैं M-.: Alt-3 Alt-Ctrl-yउदाहरण के लिए होल्डिंग Altऔर टाइपिंग के बराबर 3.। यदि आप 3.बिना जारी किए कई बार टाइप करते हैं तो आप Altअपनी पिछली कमांड लाइनों के तीसरे तर्कों के माध्यम से जाते हैं।
मिठाई

@ मिठाई: मैं अपने दूसरे पैराग्राफ में उतना ही कहता हूं और फिर एक उदाहरण दिखाता हूं।
अगली सूचना तक रोक दिया गया।

@ChadSkeeters, चेतावनी के लिए धन्यवाद कि सैकड़ों प्रविष्टियाँ होंगी ! जबरदस्त हंसी।
jdk1.0

309

!$ पिछले कमांड लाइन तर्क का अंतिम तत्व मिलता है।


115
!:3आपको तीसरा स्थान मिलता है
मैट डॉज

108
! * आप सभी को उन्हें मिल जाता है
wonton

75
!!आपको पूरी अंतिम कमांड मिलती है। यदि आप उपयोग करना भूल गए तो उपयोगी है sudo
अंक 3

43
!:1-2आप सभी को 3 तर्क मिलते हैं
टायलर ब्रॉक

5
चेतावनी का एक शब्द - यदि आप संयुक्त तर्क का उपयोग करते हैं echo foo{,bar} baz, तो कमांड मुद्रित के रूप में दर्ज किया जाता है और बाद में फैलता है। ऊपर के साथ, के echo !:1बाद का उपयोग कर हल करने के लिए echo foo{,bar}और फिर फैलता हैecho foo foobar
शॉन

201

पहले तर्क का उपयोग करने के लिए, आप उपयोग कर सकते हैं !^या!:1

उदाहरण:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

चूंकि आपका प्रश्न किसी अन्य तर्क का उपयोग करने के बारे में है, इसलिए यहां कुछ उपयोगी हैं:

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

पहले चार रूपों का अधिक बार उपयोग किया जाता है। फॉर्म !:2-कुछ प्रति-सहज है, क्योंकि इसमें अंतिम तर्क शामिल नहीं है।


क्या दूसरा-अंतिम आइटम प्राप्त करने का कोई तरीका है? file3से मिलता है mv file1 file2 file3 target/?
चार्ली हार्डिंग

3
मुझे यह उत्तर बहुत पसंद आया और सिर्फ पूर्णता के लिए, मैं '-2 -2' सिंटैक्स के बारे में बताने वाली एक पंक्ति जोड़ने का सुझाव देता हूं, जो आपको पिछली से पिछली कमांड तक पहुंचने की अनुमति देता है।
बीबीवी

1
@bbv कमांड को और भी पूर्णता देने के लिए '! 2' जो आपको इतिहास में दूसरी प्रविष्टि का उपयोग करने की अनुमति देता है (यदि यह अभी भी आपकी इतिहास सेटिंग्स के आधार पर उपलब्ध है)। उपयोगी यदि आप प्रत्येक संकेत में इतिहास संख्या प्रदर्शित करते हैं।
816-8055

53

मुझे पसंद आया @larsmans जवाब तो मुझे बहुत कुछ सीखना था। इस जवाब को जोड़कर दूसरों को मैन पेज सेक्शन खोजने में मदद करें और जानें कि Google के लिए क्या है:

$ man  -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators

Word designators are used to select desired words from the event.
A : separates the event specification from the word designator.
It may be omitted if the word designator begins with a ^, $, *, -,
or %.  Words are numbered from the beginning of the line, with the
first word being denoted by 0 (zero).  Words are inserted into the
current line separated by single spaces.

   0 (zero)
          The zeroth word.  For the shell, this is the command word.
   n      The nth word.
   ^      The first argument.  That is, word 1.
   $      The last argument.
   %      The word matched by the most recent ‘?string?’ search.
   x-y    A range of words; ‘-y abbreviates 0-y’.
   *      All of the words but the zeroth.
          This is a synonym for 1-$’.  
          It is not an error to use * if there is just one word in
          the event; the empty string is returned in that case.
   x*     Abbreviates x-$.
   x-     Abbreviates x-$ like x*, but omits the last word.

   If a word designator is supplied without an event
   specification, the previous command is used as the event.

18

! ^ पहले तर्क के लिए आदेश हो सकता है। मुझे यकीन नहीं है कि अगर nth पाने का कोई तरीका है।


7
यह है
!:

क्या एन-वें अंतिम आइटम प्राप्त करने का एक तरीका है, इसलिए पसंद है !:n, लेकिन शुरुआत के बजाय अंत से गिनती?
चार्ली हार्डिंग

14

आप अपने इतिहास में किसी भी आदेश से तर्क भी प्राप्त कर सकते हैं!


$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
  601  echo build/libs/jenkins-utils-all-0.1.jar
  602  history | tail -10
  603  echo a b c d e f g
  604  echo build/libs/jenkins-utils-all-0.1.jar
  605  history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar


4

उबंटू 18.04 पर परीक्षण किया गया


पिछली दलीलें डालने के लिए:

  • Alt+ .: अंतिम कमांड से अंतिम तर्क डालें।
  • Alt+ #+ .: अंतिम कमांड से अंतिम # तर्क डालें।
  • Alt+ -, #, Alt+ ., Zsh: Alt + -+ #+ .: पिछले आदेश से पहले तर्क #nth डालने।

लिनक्स में आप इतिहास में वापस जाने के लिए कमांड दोहरा सकते हैं

उदाहरण:

अंतिम आदेश है:

mv foo bar
  • Alt+ 0+ .: अंतिम कमांड = का पहला तर्क डालेंmv
  • Alt+ 2+ .: अंतिम कमांड के अंतिम 2 तर्क डालें =foo
  • up, Ctrl+ w: अंतिम शब्द के बिना अंतिम आदेश =mv foo

सामान्य शॉर्टकट

  • Ctrl+ w: कर्सर से अंतिम शब्द निकालता है
  • Alt+ d: कर्सर से अगला शब्द निकालता है
  • Ctrl+ k: कर्सर के बाद सब कुछ काट देता है
  • Ctrl+ u, zsh: Alt + w: कर्सर से पहले सब कुछ काट देता है
  • zsh: Ctrl + u: पूरे कमांड को काट देता है (bash में आप Ctrl+ u, Ctrl+ जोड़ सकते हैं k)
  • Ctrl+ y: पहले से काटा पात्रों पेस्ट Ctrl+ uऔर Ctrl+k
  • Ctrl+ _: पिछले संपादन को पूर्ववत करें (बहुत उपयोगी होने पर Ctrl+ w)
  • Ctrl+ left: अंतिम शब्द पर जाएं
  • Ctrl+ right: अगले शब्द पर जाएँ
  • homeया Ctrl+ a: लाइन की शुरुआत के लिए कदम
  • endया Ctrl+ e: पंक्ति के अंत में जाएं

पिछले आदेश में तर्कों के माध्यम से पुनरावृति करने के लिए

केवल zsh में काम करता है

इसे चलाएं या इसे अपने साथ जोड़ें ~/.zshrc

autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word

अब Alt+ .जैसा चाहें वापस जाने के लिए Alt+ :का उपयोग करें, फिर तर्कों के माध्यम से पुनरावृति करने के लिए + का उपयोग करें

अंतिम आदेश मान लिया गया है

echo 1 2 3 4 5
  • Alt+ .:5
  • Alt+ .+ ::4
  • Alt+ .+ :+ ::3
  • Alt+ .+ :+ :+ ::2
  • Alt+ .+ :+ :+ :+ ::1
  • Alt+ .+ :+ :+ :+ :+ ::echo

स्रोत: https://stackoverflow.com/a/34861762/3163120

उपलब्ध सभी शॉर्टकट देखने के लिए

  • दे घुमा के: bind -lp
  • zsh: bindkey -L

मैं इस अप-टू-डेट को इस gist https://gist.github.com/madacol/da38e42d7e45c2949a9f425cc20543e9 पर रख रहा हूं


1
Alt .मैक पर Zsh पर टाइप कर रहा है।
आंद्रे पेना

1
Esc । काम करता है, भले ही यह केवल पिछले एक के लिए काम करता है। आप समय में वापस जाने के लिए टाइपिंग नहीं रख सकते। शायद यह जवाब अपडेट करने लायक होगा। आपका बहुत बहुत धन्यवाद।
एंड्रे पेना

आप सभी शॉर्टकट्स को देखने के लिए zshbindkey -L में दौड़ सकते हैं , हो सकता है कि यह समस्या को इंगित करने में मदद करे, या अन्य उपयोगी कमांड भी खोजे । उदाहरण के लिए मेरे मामले में: बंधन Alt .को परिभाषित किया गया है bindkey "^[." insert-last-wordCtrl L(साफ स्क्रीन करने के लिए) -> bindkey "^L" clear-screenAlt+Ctrl h-> bindkey "^[^H" backward-kill-word( Ctrl wअंतिम शब्द को हटाने के लिए)
मैडाकोल

@ मेदकॉल मैं बाँध कीज़ पर भी देख सकता हूँ जो उल्लेखित प्रति-पहले-शब्द के रूप में है bindkey "^[^_" copy-prev-word
kikeenrique

3

मूल रूप से इसका उपयोग पिछले (कमांड के) तर्कों को पूरा करने में होता है

उदाहरण के लिए, यदि निम्न आदेश जारी किया जाता है:

echo Hello, world how are you today?

तो, Hello,पहला तर्क है, और हो जाएगा छठे , पिछले एक है कि; यह टाइप करके संदर्भित किया जा सकता है:today?

Alt+6 के बाद Ctrl-Alt-6


Ctrlपारंपरिक रूप ^से मुख्य नामों से उपजे एक टोपी चरित्र के रूप में निरूपित किया जाता है , और Altजैसा M-कि एम एटा उपसर्ग है।

तो उपरोक्त शॉर्टकट ^Myको yank के रूप में फिर से परिभाषित किया जा सकता है ।


इसके अलावा, कमांड लाइन में टोपी का प्रतिस्थापन शॉर्टकट है:

echo Hello, world!

^Hello^Bye

Bye, world!

पिछले कमांड के पहले मिलान वाले स्ट्रिंग को बदलने के लिए , जिसका अर्थ है:

Hello, world! Hello, people!

^Hello^Bye

परिणाम होगा:

Bye, world! Hello, people!

दूसरा मैच ( hello) अपरिवर्तित रहा।

नोट: टोपी के बीच जगह न छोड़े , या ऑपरेशन काम नहीं करेगा।


उपरोक्त केवल एक शॉर्टकट है:

!:s/Hello/Bye

घटना स्तरीय (*) पिछला आदेश में पहली बार मिलती (मिलान) स्ट्रिंग के लिए प्रतिस्थापन, जबकि साथ पहले भाग लगाकर gस्विच के लिए लागू होगी पूरी लाइन जी lobally :

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

के रूप में आमतौर पर ऐसी ही अन्य संबंधित आदेशों में किया जा रहा sed, viमें, और regex(नियमित अभिव्यक्ति) - खोज करने के लिए (एक standart तरह से मैच स्ट्रिंग )।

नहीं, आप नहीं कर सकते हैं !:sg/Hello/Byeया !:s/Hello/Bye/gयहाँ, यह वाक्यविन्यास है !


  • ! घटनाओं के लिए है; ईवेंट को कमांड इतिहास में किए गए कमांड आउटपुट या ऑपरेशन के रूप में समझा जा सकता है।

यह वही है जो मैंने इसे स्वयं उपयोग करके और स्वयं से चीजों को आज़माकर समझा, जो मैंने विभिन्न स्रोतों से पढ़े, जिनमें मैनुअल पेज, ब्लॉग और फ़ोरम शामिल हैं।

आशा है कि यह bashबोर्न-अगेन शेल (शेल पर एक नाटक sh, जिसे खुद अपने आविष्कारक के अंतिम नाम के बाद बॉर्न शेल कहा जाता है) के कुछ तरीकों से कुछ प्रकाश डाला जाएगा , सर्वरों ( सर्वर ओएस ) सहित कई वितरणों में डिफ़ॉल्ट शेल क्या है ।



0

स्वीकृत उत्तर के अंत में वर्णित विधि मेरे लिए शून्य तर्क के साथ भी काम करती है। मेरे पास ये पंक्तियाँ हैं ~/.inputrc:

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e.इसका फायदा \e2\e\C-yयह है कि अगर यह पिछली कमांड के दूसरे तर्क को कई बार डालने के बजाय बार-बार दबाया जाता है, तो यह पिछले कमांड के माध्यम से साइकिल करता है।

पूरे पिछले कमांड को डालने के लिए, आप टाइप कर सकते हैं !!\e^\e^है history-expand-line


0

यदि आप एक मैक पर हैं, तो आप ctrl + अक्षर के साथ विस्तारित वर्ण प्राप्त करेंगे। मेरे पास मेरे टर्मिनल (iTerm2) में मेटा के रूप में परिभाषित राइट-ऑफ-स्पेस-बार-विकल्प है। इसका मतलब है कि मैं शब्द को नेविगेट करने और पिछले कमांड से पैरामीटर खींचने के लिए कुंजी का उपयोग करता हूं।

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