Önceki komuttan bağımsız değişkenler nasıl kullanılır?


288

Esc+ .Son komutun son argümanını verdiğini biliyorum .

Ama son emrin ilk argümanıyla ilgileniyorum. Bunu yapmak için anahtar bir bağlayıcı var mı?

Aynı satırlarda, son komuttan n. Argümanı almanın genel bir yolu var mı? Bir bash betiğinde $0, $1vb. Kullanabilirsiniz , ancak bunların komut satırında çalışmadığını biliyorum.

Ayrıca, sürekli olarak Esc+ tuşuna basarak son argümanla yapabileceğimiz gibi, önceki komutların 0. argümanında yineleme yapmaya ne dersiniz .?

Yanıtlar:


284

Tıpkı M-.(meta-dot veya esc-dot veya alt-dot) readline işlevi yank-last-arg, M-C-y(meta-control-y veya esc-ctrl-y veya ctrl-alt-y) readline işlevidir yank-nth-arg. Belirtmeden n, bir önceki komutun ilk argüman kopyalar.

Bir bağımsız değişken belirtmek için Escape tuşuna ve bir sayıya basın veya Alt tuşunu basılı tutun ve bir sayıya basın. Yapabilirsiniz Alt- -negatif bir sayı belirtmeye başlamak için Alt tuşunu bırakın ve basamağa basın (bu, argümanlar listesinin sonundan sayılacaktır.

Misal:

Aşağıdaki komutu girin

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

Şimdi bir sonraki istemde, echo(aşağıdaki boşlukla) yazın, sonra

Alt- Ctrl- düğmesine bastığınızda yartık şunu göreceksiniz:

$ echo a

Enterhenüz basmadan , aşağıdakileri yapın

Basın Alt- 3 Alt- Ctrl-y

Basın Alt- - 2 Alt- Ctrl-y

Şimdi göreceksiniz:

$ echo ace

Bu arada, echo0 argümanını seçerek çizgiyi koyabilirsiniz :

Basın Alt- 0 Alt- Ctrl-y

Düzenle:

Orijinalinize eklediğiniz soruyu cevaplamak için:

Tuşuna basabilirsiniz Alt- 0sonra art arda basın Alt- .adıma önceki komutları aracılığıyla (arg 0). Benzer şekilde Alt- -daha sonra yinelenen Alt- .önceki sondan son bağımsız değişkenlere geçmenizi sağlar.

Tarihte belirli bir çizgi üzerinde uygun bir argüman yoksa, zil çalınır.

Sık kullandığınız belirli bir kombinasyon varsa, bir tuş vuruşu gerçekleştirmek için bir makro tanımlayabilirsiniz. Bu örnek Alt- Shift- tuşlarına basarak önceki komutlardaki ikinci argümanı geri çağıracaktır Y. Bunun yerine tercih ettiğiniz herhangi bir tuş vuruşunu seçebilirsiniz. Öncekiler arasında gezinmek için art arda basabilirsiniz.

Denemek için makroyu bir Bash bilgi istemine girin:

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

Kalıcı olmasını sağlamak için bu satırı ~/.inputrcdosyanıza ekleyin :

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

Ne yazık ki, bu arg 0 veya negatif argüman numaraları için işe yaramıyor gibi görünüyor.


14
Bash / readline için klavye kısayollarını bind -lpararken, mevcut bağlamaları çalıştırmayı ve bakmayı seviyorum .
Chad Skeeters

1
@ChadSkeeters: Ve -s(Bash 4'te yeni) kullanılarak oluşturulan makroları listeler -x.
sonraki duyuruya kadar duraklatıldı.

Sayı bağımsız değişkenini de ile kullanabileceğinizi unutmayın M-.: Alt-3 Alt-Ctrl-yörneğin, tutma Altve yazmaya eşittir 3.. Bunu 3.bırakmadan birden çok kez Altyazarsanız, önceki komut satırlarınızın üçüncü bağımsız değişkenlerini gözden geçirirsiniz.
tatlı

@ tatlı: İkinci paragrafımda çok fazla şey söylüyorum ve sonra bir örnek gösteriyorum.
sonraki duyuruya kadar duraklatıldı.

@ChadSkeeters, yüzlerce girişin olacağı uyarısı için teşekkürler ! Lol.
jdk1.0

310

!$ önceki komut satırı bağımsız değişkeninin son öğesini alır.


115
!:3üçüncü olanı alır
Matt Dodge

108
! * Hepsini alır
wonton

75
!!size son komutun tamamını verir. Kullanmayı unuttuysanız kullanışlıdır sudo.
Haziran'da Un3qual

43
!:1-23 argümanın sonuncusu dışında hepinizi alır
Tyler Brock

5
Yalnızca bir uyarı sözcüğü - gibi birleştirilmiş bağımsız değişkenler kullanırsanız echo foo{,bar} baz, komut basılı olarak kaydedilir ve daha sonra genişler. Yukarıdakilerle, echo !:1after komutunu kullanarak çözülür echo foo{,bar}ve sonra genişlerecho foo foobar
Sean

201

İlk argümanı kullanmak için !^veya!:1

Misal:

$ 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

Sorunuz başka herhangi bir argüman kullanmakla ilgili olduğundan, işinize yarayabilecek bazı şeyler:

!^      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

İlk dört form daha sık kullanılır. Form !:2-, son argümanı içermediği için biraz sezgiseldir.


Sonuncu ikinci öğeyi almanın bir yolu var mı? yani almak file3den mv file1 file2 file3 target/?
Charlie Harding

3
Bu cevabı çok beğendim ve sadece tamlık uğruna, önceki komutlara erişmenizi sağlayan '! -2' sözdizimi hakkında bir satır eklemenizi öneririm.
bbv

1
@bbv Ayrıca daha fazla bütünlük için, tarihin ikinci girişine erişmenizi sağlayan '! 2' komutu (geçmiş ayarlarınıza bağlı olarak hala mevcutsa). Her istemde geçmiş numarasını görüntülerseniz yararlıdır.
816-8055

53

@Larsmans'ın cevabını çok sevdim, daha fazla öğrenmek zorunda kaldım. Başkalarının kılavuz sayfası bölümünü bulmasına ve ne için Google'a gideceğini bilmesine yardımcı olmak için bu yanıtı eklemek:

$ 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

! ^ ilk argümanın komutu olabilir. nth almak için bir yol olup olmadığından emin değilim.


7
öyle
Sergiu

N'inci son öğeyi almanın bir yolu var mı, mesela !:nbaşlangıçtan ziyade sondan saymak mı?
Charlie Harding

14

Ayrıca geçmişinizdeki herhangi bir komuttan argümanlar alabilirsiniz!


$ 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

Ubuntu 18.04 üzerinde test edildi


Önceki bağımsız değişkenleri eklemek için:

  • Alt+ .: son komuttan son argümanı ekle.
  • Alt+ #+ .: son komuttan #uncu son argümanı ekle.
  • Alt+ -, #, Alt+ ., Zsh: Alt + -+ #+ .: Geçen komutundan ilk argüman #nth insert.

Linux'ta tarihe geri dönmek için komutları tekrarlayabilirsiniz

Misal:

Son komut:

mv foo bar
  • Alt+ 0+ .: son komutun ilk argümanını ekle =mv
  • Alt+ 2+ .: son komutun son 2. bağımsız değişkenini ekle =foo
  • up, Ctrl+ w: son kelime olmadan son komut =mv foo

Genel kısayollar

  • Ctrl+ w: son sözcüğü imleçten kaldırır
  • Alt+ d: sonraki kelimeyi imleçten kaldırır
  • Ctrl+ k: imleçten sonra her şeyi keser
  • Ctrl+ u, zsh: Alt + w: imleçten önceki her şeyi keser
  • zsh: Ctrl + u: tüm komutu keser (bash'da Ctrl+ u, Ctrl+ ' yı birleştirebilirsiniz k)
  • Ctrl+ y: önceden Ctrl+ uve Ctrl+ ile kesilmiş karakterleri yapıştırk
  • Ctrl+ _: son düzenlemeyi geri al ( Ctrl+ değerini aştığında çok kullanışlıdır w)
  • Ctrl+ left: son kelimeye git
  • Ctrl+ right: sonraki kelimeye git
  • homeveya Ctrl+ a: satır başına git
  • endveya Ctrl+ e: satır sonuna git

Önceki bir komuttaki bağımsız değişkenleri yinelemek için

sadece zsh ile çalışır

çalıştır ya da ekle ~/.zshrc

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

Şimdi kullanmak Alt+ .istediğiniz kadar sonra kullanmak arkasına olarak gitmek Alt+ :argümanlar yinelemenize

Son komutun

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

Kaynak: https://stackoverflow.com/a/34861762/3163120

Mevcut tüm kısayolları görmek için

  • bash: bind -lp
  • zsh: bindkey -L

Bu kadar güncel bu ve özü tutuyorum https://gist.github.com/madacol/da38e42d7e45c2949a9f425cc20543e9


1
Alt .Mac'te Zsh üzerinde 🤔 yazıyor
André Pena

1
ESC . sadece sonuncusu için çalışmasına rağmen çalışır. Zamanda geriye gitmek için yazmaya devam edemezsiniz. Belki de cevabı güncellemeye değer. Çok teşekkür ederim.
André Pena

Sen çalıştırabilir bindkey -Liçinde zsh belki de diğer yararlı komutlar bulmak bile sorunu tespit etmenize yardımcı ya olacak, tüm kısayolları binded görmek için. Benim durumumda örneğin: bağlama Alt .olarak tanımlanır bindkey "^[." insert-last-word. Ctrl L(ekranı temizlemek için) -> bindkey "^L" clear-screen. Alt+Ctrl h-> bindkey "^[^H" backward-kill-word( Ctrl wson sözü kaldırmakla aynı )
Madacol

@Madacol Ben de bağlama anahtarları yukarıda belirtilen kopya önceki kelime olarak görebilirsiniz bindkey "^[^_" copy-prev-word
kikeenrique

3

Temel olarak önceki (komut) argümanlarını sormada bir yararı vardır .

Örneğin, aşağıdaki komut verilirse:

echo Hello, world how are you today?

Daha sonra, Hello,ilk argüman ve olacak altıncı sonuncu; yani buna yazarak başvurulabilir:today?

Alt+6 bunu takiben Ctrl-Alt-6


Ctrlgeleneksel olarak şapka karakteri olarak gösterilir ^tuşları İsimler başına ilave ve Altsıra M-olmasıdır M eta öneki.

Böylece yukarıdaki kısayol, ^Myyank olarak yeniden tanımlanabilir .


Ayrıca, komut satırında şapka değiştirme kısayolu vardır:

echo Hello, world!

^Hello^Bye

Bye, world!

önceki komutun ilk eşleşen dizesini değiştirmek , yani:

Hello, world! Hello, people!

^Hello^Bye

sonuç:

Bye, world! Hello, people!

ikinci maçı ( hello) değiştirmeden bırakır .

Not: Şapkalar arasında boşluk bırakmayın , aksi takdirde işlem çalışmaz.


Yukarıdaki sadece bir kısayoldur:

!:s/Hello/Bye

önceki komutta bulunan ilk bulunan (eşleşen) dize için olay düzeyinde (*) ikamesi kullanılırken, ilk parçanın ganahtarla önek eklenmesi , tüm satıra g için lobal olarak uygulanır :

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

olarak genellikle gibi diğer ilgili komutlar yapılıyor sed, vive de regex(normal ifade) - (aramak için standart bir yol eşleşme dizesini ).

Hayır, yapamazsınız !:sg/Hello/Byeya da !:s/Hello/Bye/gburada, bu sözdizimi !


  • ! olaylar içindir; olay, komut çıktısı veya komut geçmişinde yapılan işlem olarak anlaşılabilir.

Bunu kendim kullanarak ve manuel sayfalar, bloglar ve forumlar da dahil olmak üzere çeşitli kaynaklardan okuduğum şeyleri kendi başıma deneyerek anladım.

Umarım gizemli yollara ışık tutacaktır bash, Bourne-Again kabuğunun ( shmucidinin soyadından sonra Bourne kabuğu olarak adlandırılan kabukta bir oyun ), sunucular da dahil olmak üzere birçok dağıtımda varsayılan kabuk olan sunucu ( sunucu işletim sistemleri ).


3

! ^ size ilk parametreyi alacaktır,! $ size son parametreyi alacaktır ,!: n size n'inci elementi alacaktır.


0

Kabul edilen cevabın sonunda açıklanan yöntem benim için sıfırıncı argümanla da çalışır. Bende şu satırlar var ~/.inputrc:

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

\e2\e.avantajı \e2\e\C-y, önceki komutun ikinci argümanını birden çok kez eklemek yerine, tekrar tekrar basılırsa önceki komutlar arasında geçiş yapması avantajına sahiptir .

Önceki komutun tamamını eklemek için şunu yazabilirsiniz !!\e^. \e^olduğunu history-expand-line.


0

Mac kullanıyorsanız ctrl + letter ile genişletilmiş karakterler elde edersiniz. Benim terminal (iTerm2) ayarında meta olarak tanımlanan alan hakkı çubuğu seçenek anahtarım var. Bu, kelimeyi kullanarak gezinmek ve önceki komutlardan parametreleri çekmek için anahtarı kullandığım anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.