Ok tuşlarını kullanmadan son komutu nasıl tekrarlarım?


115

UpÖnceki komutları tekrarlamak için kullanabileceğimi biliyorum . Son komutu çalıştırmak sadece Up+ işaretini içerir Enter. Ancak, çok fazla zaman harcadığım için Happy Hacking Keyboard'u satın almayı düşünüyordum vim.

Bu klavyenin ok tuşları yoktur ve bu tür bir davranışı nasıl elde edeceğimi bilmenin tek yolu Ctrl+ ' Rya basmak ve önceki komutumu tekrarlamaya başlamaktır.

Bir UNIX terminalinde Up+ Entertuşlarını ok tuşları olmadan taklit etmenin kolay bir yolu var mı ?


1
Terminal etiketini kullandığınız kabuk ile değiştirmelisiniz .
Cristian Ciupitu

2
@ aydınlatmak hiçbir fare ...
Quant

Değil miydi Mutlu Hacking Klavye 2006 yılında durdurulan?
Peter Mortensen

@PeterMortensen hayır, hala mevcut değil. İlk versiyondan bahsediyor olabilirsiniz, ancak yeni modeller mevcut olmaya devam ediyor.
Quant

Yanıtlar:


164

İle cshya da herhangi bir kabuk uygulayan cshbenzeri geçmişi ikamesi ( tcsh, bash, zsh):

!!

Öyleyse Enter.


Veya alternatif olarak :

!-1

Öyleyse Enter.


Veya Ctrl+ P,Enter


Sihirli uzay

Ayrıca, siz bunları yürütene kadar (çok geç olabileceği zaman), sizin için otomatik olarak açılmayacağını !!ve !-1açılmayacağını unutmayın .

Kullanıyorsanız , komutun içine bashkoyabilirsiniz , daha sonra komut girildikten sonra onları otomatik olarak genişletir ve yürütmeden önce incelemenizi sağlar. Bu, özellikle bir süre önce çalıştırılan bir komuttan geçmişini genişletmek için kullanışlıdır, örn . İle başlayan son komutu çalıştırır . Sihirli alanla, çalıştırılmadan önce komutu önizleyebilirsiniz.bind Space:magic-space~/.bashrcSpace!echoecho

Yani yapmanın eşdeğer bindkey ' ' magic-spacebölgesi tcshveya zsh.


1
@Arman Yardım etmekten memnun oldum. Bir sürü tarih genişleme komutu var; link bunlardan bazılarını listeler. Bunlardan bazılarının kullanımında yardımcı olabilecek sihirli alan hakkında bazı bilgileri düzenledim.
Sparhawk,

3
magic-spaceBu tatlı bir seçenek!
fduff

1
Ayrıca, okuma çizgisinin geçmiş genişlemesini gerçekleştirmesine, ancak enter tuşuna ilk basışında komutu çalıştırmamasına neden olacak bir histverifyseçenek vardır shopt. Hangi sonucu değerlendirmek ve çalıştırmak isteyip istemediğinize karar vermenizi sağlayacak.
Etan Reisner

2
Asla nedenini anlamadım !! CTRL-P'den çok daha fazla kullanılıyor. CTRL-P çalıştırmadan önce komutu görmenizi sağlar - hatta üzerinde değişiklik yapabilirsiniz. Her zaman zarlarla yuvarlandığımı hissediyorum.
abonet

1
@ abonet Bulduğum başka bir kullanım alanı !!, genişletmesini yerinde kullanmak . Örneğin sudo !!.
Sparhawk

50

Komut satırı düzenleme özelliği bulunan çoğu kabuk, Emacs anahtar bağlantılarını destekler. (küçük bir alt küme)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

Alternatif olarak, kabuğunuzu vi komut düzenleme modunu kullanacak set -o vişekilde, kabuk başlangıç ​​dosyanıza ekleyerek ayarlayabilirsiniz (örn ~/.bashrc.). Sonra, örneğin,

  • Kullanım EsckEnter yeniden yürütmek önceki komutu (aynı etmek !!). Eksi tuşu -ayrıca bir "yukarı taşı" komutu olarak da çalışır.
  • 12. önceki komutu tekrar çalıştırmak için EsckkkkkkkkkkkkEnter veya tuşunu kullanın Esc12kEnter(aynı !-12).
  • Kullanın Escve bir hareket komutu (yani, kuygun şekilde tekrarlandı), ve orada bulduğunuz bash komut satırını düzenleyin . Hala olacaktır unutmayın vibir kullanmanız gerekecektir böylece, komut modu vi(örn düzenleme komutu I, A, C, Raslında geçmişten komuta eklemek veya onların küçük muadilleri biri).
    Yani, örneğin, EsckisudoSpaceEntereşdeğerdir sudo !!.
  • Gelişmiş kullanıcılar için: hatta (kopyalayabilirsiniz y bir satır ve yapıştırma (den ank) metin p diğerine ut) bunu, bu nedenle karşılaştırılabilir sonuçları alabileceği !-2:- !$. (Ne yazık ki, adlandırılmış arabellekleri desteklemiyor gibi görünüyor.)

Uçbirimle ilgili emacs ilişkisini biliyordum ... ama vipüf noktası harikaydı !!!
Dox

deleteZsh
Timo

1
Bu, readline kütüphanesi tarafından uygulanır. Belgelerinde daha fazla kısayol bulunabilir.
Spidey

28

Benim favorim CTRL+ Psonra CTRL+O

Bu, varsayılan olarak çalışır, ek bir yapılandırma gerekmez. ^ P son komuta geçmenize izin verir ve ^ O geçerli satırı yürütmenize izin verir

CTRL+ Oİşaretinin istediğiniz kadar kullanılabileceğini unutmayın.


2
^ O Mac'imde hiçbir şey yapmaz.
Snowcrash

1
@Snowcrash Try^J
Daisy

Bu bir lsveya pwddaha önce yapmış olsam bile sadece boş bir çizgiyi yansıtıyor .
Snowcrash

@Snowcrash Bu ^ P sonra ^ J ...
papatya

Ctrl + P HP-UX'de çalışmıyor (hangi kabuğu kullandığını bilmiyorum). Çözüm, zsh'yi çağırmaktır.
Peter Mortensen

15

Elbette! viTuş bağlantılarına alışkın olduğunuzdan , neden kabuğunuzu bunlara yanıt verecek şekilde yapılandırmıyorsunuz? Bunun için bash, şunu içine koy ~/.inputrc:

set editing-mode vi

Bash örneklerini çalıştırmak dosyayı tekrar okumaz; bu nedenle oturumu kapatıp tekrar açın.

zshBunu sizin için bile algılar: başlangıçtaki komut dosyalarınızın hiçbiri düzenleme modunu bir şekilde veya diğerini kullanmaya zorlamazsa bindkey ve$EDITOR ortam değişkeniniz içerdiği tespit edilmezse, tuş bağlarını viotomatik olarak etkinleştirir vi. Bunu zorlamanız gerekirse, şunu içine koyun ~/.zshrc:

bindkey -v

Bundan sonra, ESCkomut satırına girmek kve jyukarı ve aşağı hareket etmek için her zamanki gibi kullanın .

Ayrıca , çoğu kabuktaki varsayılan kabuk bağlamaları emac bağlamalarıdır, bu yüzden aslında Crtl-Pve Ctrl-Nhiçbir şeyi değiştirmenize gerek kalmadan çalışmalıdır.


9

Uygulayan herhangi POSIX kabuğu ile Kullanıcı Taşınabilirlik seçeneği (içerir ksh, zsh, bash, yash), ayrıca kullanabilirsiniz fckomutu:

fc -e : -1

Bir örneğe bakın:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

Daha fazla bilgi Jonathan Leffler tarafından tarihin cevabından bir dizi komut uygulayın .


6

Tüm Mac iterm2 kullanıcıları için:

Sen bağlayabilir + Riçin 0x0C 0x10 0x0d. Bu terminali temizler ve son komutu çalıştırır.

iterm 2 ana tercihler


Terminali temizlemeden son komutu tekrar etmenin bir yolu var mı?
Luke Davis,

Ah, boşuna: Bunu okuyan herkes için, terminali temizlemeden tekrar etmek için kullanın 0x10 0x0d(yani atlayın 0x0C).
Luke Davis,

5

Sık sık süper kullanıcı olarak komutları tekrar etmem gerektiğini düşünüyorum.

sudo !!

ilk komutu yazmayı hatırlamışım gibi önceki komutu tekrarlar sudo.


2
Bunu gerçekten beğendim, aynı zamanda "reddedildi" yetkisi için iyi bir yanıt gibi görünüyor. "Ben sudo ffs demek istedim!"
Viktor Mellgren 11

3

kshKabuk varsayılan bir takma adı rEn son komutunu tekrarlar. Aşağıdakilere bağlıdır fc -s:

alias r='fc -s'

İlginçtir ki, yerleşik bashbelgeye ilişkin belgeler fc( help fcve ayrıca kılavuzun kendisinde de) bundan söz eder, ancak bu kabukta varsayılan bir takma ad değildir:

Bununla kullanmak için yararlı bir diğer addır r='fc -s', bu nedenle yazarak r cc başlayan en son komutu çalıştırır ccve yazmaya rson komutu yeniden uygular.

İçinde bash, tarih açılımlarını kapatmış olsan bile bu işe yarar set +H.

Gelen zshbir mermi, orada raynı olacak şekilde belgelenmiştir yerleşik fc -e -.

Yardımcı fcprogram bir POSIX standart yardımcı programıdır .


2

İle cshveya uygulayan herhangi kabuk cshbenzeri tarih ikame ( tcsh, bash, zsh), ayrıca kullanabilirsiniz !<beginning of command>geçen komut ile başlayan aramak için <beginning of command>.

örneğin koştuysanız

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta yürütmek tail file.txt


1

tl; dr, !!yalnızca son komutu mevcut komutunuza ekler. <backtick>!!<backtick> son komutu çalıştırır ve çıktıyı şu anki komutunuza ekler.

Aslında 2 değişken var:

  1. Son komutun kendisi
  2. Son komutun sonucu

Size 2 örnek göstereyim:

örnek 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Yukarıda gördüğünüz gibi, bir komutu yürütüyorum ve aslında sadece son komutu ekliyorum.

Başka bir varyasyon

Örnek 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"

İçin +1 vi `!!`. Çok yararlı
le_daim

0

Örneğin macun gibi iyi bir xterm emülatörü kullandığımda, devam etmemdeki en sevdiğim yol satır beslemesi de dahil olmak üzere komutu seçmek, panoya kopyalamak ve ardından yapıştırmak için fareye sağ tıklamak. Bu, komutu tek bir tıklamayla tekrarlar. Bu aynı zamanda noktalı virgüllerle ayrılmış bir dizi komut için de işe yarar.


0

!nTerminalde nth komutunu çalıştırmak için kullanabilirsiniz . 'n' historykomut satırı satırı değil .


Hangi kabuk !?son komuta genişler ? Karıştırmayacağınızdan emin misiniz !!(diğer cevaplarda zaten ele alınmıştır)?
Anthony Geoghegan

üzgünüm, aslında o zaman bu komutu deniyordum. lütfen düzenlenmiş cevabı kontrol edin. @AnthonyGeoghegan
Ravi Sevta

Aradığım kısayol buydu. Teşekkürler!
le_daim

0
  • History yazın ve çalıştırmanız ve kullanmanız gereken komutun önündeki sayıyı not edin. !number

  • Ayrıca ! -1'i kullanabilirsiniz (1 en son çalıştırdığınız komuttur, alttan yaptığınız zaman aldığınız numarayı değiştirin, en son 1'i idam ederek)

  • ! -2 (ikincisi vb.)

0

Son komutu isteyebileceğiniz birkaç katman var.

Çizgi editörü

Çizgi editörü (komutlarınızı yazdığınız yer) doğrudan ksh, bash'deki kütüphane okuma satırı ve zsh'daki kütüphane zle tarafından sağlanır. Dash gibi diğer mermilerde bu tuşları anlamak için bir düzenleme kütüphanesi olmayabilir ( --with-libeditseçenek etkin olmasa bile ).

Bu, ksh, bash, zsh işlerinde:

Ctrl- P# Emacs modu (önceki)
Ctrl- N# Emacs modu (sonraki)
ESC- k # vi modu ESC komut moduna ve yukarı k için
ESC- j # vi modu ESC komut moduna ve j için aşağı

Tarih

Birçok merminin sağladığı tarih sistemi bazı kısayolların genişletilmesine izin verir:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

komutlar

Geçmiş komutlarını alabilen bazı komutlar vardır.

Oldukça ayrıntılı komut gibi (yalnızca yazdırmak için):

history 2 | head -n-1

veya daha eski ve bu nedenle genellikle daha fazla taşınabilir fckomut (doğrudan yeniden çalıştırılır):

fc -e - -1

Ya da belki daha basit fc -s -1, ama zsh fc için böyle bir seçeneği kabul etmiyor.

Yalnızca istiyorsanız yazdırmak komutunu kullanın: fc -nl -1 -1.

Düzenlemek için, set FCEDITbir metin editörü (ex, ed emacs, vi, vb) ve doğrudan fc kullanın: fc -1.

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.