Bagaimana saya mengulangi perintah terakhir tanpa menggunakan tombol panah?

115

Saya tahu saya bisa menggunakannya Upuntuk beralih melalui perintah sebelumnya. Menjalankan perintah terakhir hanya melibatkan Up+ Enter. Namun, saya berpikir untuk membeli Keyboard Happy Hacking karena saya menghabiskan banyak waktu di vim.

Keyboard ini tidak memiliki tombol panah, dan satu-satunya cara saya tahu cara mendapatkan perilaku seperti ini adalah dengan menekan Ctrl+ Rdan mulai mengulangi perintah saya sebelumnya.

Apakah ada cara mudah untuk meniru Up+ Enterdi terminal UNIX tanpa tombol panah?

bergalah
sumber
1
Anda harus mengganti tag terminal dengan shell yang Anda gunakan.
Cristian Ciupitu
2
@ illuminÉ no mouse ...
quant
Bukankah Happy Hacking Keyboard dihentikan pada 2006?
Peter Mortensen
@PeterMortensen tidak, itu masih tersedia. Anda mungkin merujuk ke versi pertama, tetapi model yang lebih baru terus tersedia.
kuant

Jawaban:

164

Dengan cshatau shell menerapkan csh-seperti substitusi sejarah ( tcsh, bash, zsh):

!!

Lalu Enter.


Atau sebagai alternatif :

!-1

Lalu Enter.


Atau Ctrl+ P,Enter


Ruang ajaib

Juga, perhatikan itu !!dan !-1tidak akan meluas secara otomatis untuk Anda, sampai Anda mengeksekusinya (ketika mungkin sudah terlambat).

Jika menggunakan bash, Anda dapat memasukkannya bind Space:magic-spaceke dalam ~/.bashrc, kemudian menekan Spacesetelah perintah akan secara otomatis memperluasnya sebaris, memungkinkan Anda untuk memeriksanya sebelum eksekusi. Ini sangat berguna untuk ekspansi sejarah dari perintah yang dijalankan beberapa waktu lalu, mis. !echoAkan menarik perintah terakhir yang dimulai dengan perintah echo. Dengan ruang ajaib, Anda bisa melihat pratinjau perintah sebelum dijalankan.

Itu sama dengan melakukan bindkey ' ' magic-spacedi tcshatau zsh.

Sparhawk
sumber
1
@Arman Senang membantu. Ada banyak sekali perintah ekspansi sejarah; tautannya mencantumkan beberapa di antaranya. Saya telah mengedit beberapa informasi tentang ruang ajaib yang mungkin membantu penggunaan beberapa di antaranya.
Sparhawk
3
magic-spaceitu salah satu pilihan yang manis!
fduff
1
Ada juga histverifyopsi shoptyang akan menyebabkan readline untuk melakukan ekspansi histori tetapi tidak menjalankan perintah pada penekanan pertama dari tombol enter. Yang akan membiarkan Anda mengevaluasi hasilnya dan memutuskan apakah itu yang ingin Anda jalankan.
Etan Reisner
2
Tidak pernah mengerti kenapa !! digunakan jauh lebih banyak daripada CTRL-P. CTRL-P memungkinkan Anda melihat perintah sebelum menjalankannya - dan Anda bahkan dapat melakukan modifikasi padanya. Saya selalu merasa seperti sedang melempar dadu !!
abonet
1
@abonet Penggunaan lain yang baru saja saya temukan !!adalah menggunakan ekspansi di tempat . Sebagai contoh sudo !!.
Sparhawk
50

Kebanyakan shell yang memiliki fitur pengeditan baris perintah mendukung binding kunci Emacs. (bagian kecil)

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

Atau, Anda dapat mengatur shell Anda untuk menggunakan mode edit perintah vi, dengan menambahkan set -o vifile startup shell Anda (mis., ~/.bashrc). Lalu, misalnya, Anda bisa

  • Gunakan EsckEnter untuk menjalankan kembali perintah sebelumnya (sama seperti !!). Kunci minus -juga berfungsi sebagai perintah "naik".
  • Gunakan EsckkkkkkkkkkkkEnter atau Esc12kEnter untuk menjalankan kembali perintah ke-12 sebelumnya (sama seperti !-12).
  • Gunakan Escdan perintah gerak (yaitu, kdiulangi sesuai), lalu edit baris perintah bash yang Anda temukan di sana. Ingat, Anda masih akan di vimodus perintah, sehingga Anda akan perlu menggunakan viperintah editing (misalnya, I, A, C, R, atau rekan-rekan satu dari huruf kecil mereka) untuk benar-benar menambah perintah dari sejarah.
    Jadi, misalnya, EsckisudoSpaceEntersetara dengan sudo !!.
  • Untuk pengguna tingkat lanjut: Anda bahkan dapat menyalin ( y ank) teks dari satu baris dan menempelkannya ( p ut) di baris lain, sehingga Anda dapat mencapai hasil yang sebanding !-2:- !$. (Sayangnya, sepertinya tidak mendukung buffer bernama.)
Gilles
sumber
Saya tahu tentang hubungan emacs dengan terminal ... tapi vitriknya hebat !!!
Dox
Saya mendapat deleteCtl + u di Zsh
Timo
1
Ini diimplementasikan oleh perpustakaan readline. Jalan pintas lebih lanjut dapat ditemukan pada dokumentasinya.
Spidey
28

Yang favorit saya adalah CTRL+ Plalu CTRL+O

Ini berfungsi secara default, tidak diperlukan konfigurasi tambahan. ^ P akan membiarkan Anda beralih ke perintah terakhir dan ^ O akan membiarkan Anda mengeksekusi baris saat ini

Perhatikan bahwa CTRL+ Odapat digunakan sebanyak yang Anda inginkan

bunga aster
sumber
2
^ O tidak melakukan apa pun di Mac saya.
Snowcrash
1
@Snowcrash Try^J
daisy
itu hanya menggemakan baris kosong bahkan jika saya sudah melakukan lsatau pwdsebelumnya.
Snowcrash
@Snowcrash Ini ^ P lalu ^ J ...
daisy
Ctrl + P tidak berfungsi pada HP-UX (Saya tidak tahu shell mana yang digunakannya). Solusinya adalah dengan memanggil `zsh '.
Peter Mortensen
15

Tentu! Karena Anda terbiasa dengan vikeybindings, mengapa tidak mengkonfigurasi shell Anda untuk meresponsnya? Untuk bash, letakkan ini di ~/.inputrc:

set editing-mode vi

Menjalankan instance bash tidak akan membaca ulang file, jadi logout dan kembali.

zshbahkan akan mendeteksi ini untuk Anda: jika tidak ada skrip startup Anda yang memaksakan mode pengeditan satu arah atau yang lain menggunakan bindkey dan jika $EDITORvariabel lingkungan Anda terdeteksi mengandung vi, maka itu secara otomatis akan mengaktifkan viikatan kunci. Jika Anda perlu memaksanya, letakkan ini di ~/.zshrc:

bindkey -v

Setelah itu, gunakan ESCseperti biasa untuk memasukkan baris perintah dan kdan juntuk bergerak ke atas dan ke bawah.

JUGA : Bindings shell default di sebagian besar shell adalah binding emacs, jadi sebenarnya Crtl-Pdan Ctrl-Nseharusnya sudah berfungsi tanpa Anda harus mengubah apa pun.

Celada
sumber
9

Dengan shell POSIX melaksanakan Pengguna Portabilitas pilihan (termasuk ksh, zsh, bash, yash), Anda juga dapat menggunakan fcperintah:

fc -e : -1

Lihat sebuah contoh:

$ echo "hello"
hello

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

Info selengkapnya di Jalankan serangkaian perintah dari jawaban riwayat oleh Jonathan Leffler.

fedorqui
sumber
6

Untuk semua pengguna Mac iterm2 Anda:

Anda dapat mengikat + Rke 0x0C 0x10 0x0d. Ini akan menghapus terminal dan menjalankan perintah terakhir.

iterm 2 preferensi utama

Brian Wigginton
sumber
Apakah ada cara untuk mengulangi perintah terakhir tanpa membersihkan terminal?
Luke Davis
Ah, nevermind: bagi siapa pun yang membaca ini, untuk mengulang tanpa membersihkan terminal, gunakan 0x10 0x0d(yaitu hilangkan 0x0C).
Luke Davis
5

Saya merasa saya perlu mengulang perintah sebagai pengguna super sering, jadi

sudo !!

redoes perintah sebelumnya seolah-olah saya ingat untuk mengetik sudodi tempat pertama.

Jared Chmielecki
sumber
2
Saya sangat suka ini, juga terlihat seperti respons yang baik untuk "otorisasi ditolak". "Maksudku, sudo ffs!"
Viktor Mellgren
3

The kshshell memiliki alias standar ryang berulang perintah terbaru. Ini terikat pada fc -s:

alias r='fc -s'

Menariknya, bashdokumentasi untuk fcbuiltin ( help fc, dan juga dalam manual itu sendiri) bahkan menyebutkan ini, tetapi itu bukan alias default di shell itu:

Alias ​​yang berguna untuk digunakan adalah r='fc -s', sehingga pengetikan r cc menjalankan perintah terakhir yang dimulai dengan ccdan pengetikan rmenjalankan kembali perintah terakhir.

Dalam bash, ini juga akan berfungsi bahkan jika Anda telah menonaktifkan ekspansi sejarah set +H.

Di zshshell, ada rbuiltin yang didokumentasikan sama dengan fc -e -.

The fcutilitas utilitas standar POSIX .

Kusalananda
sumber
2

Dengan cshatau shell menerapkan csh-seperti substitusi sejarah ( tcsh, bash, zsh), Anda juga dapat menggunakan !<beginning of command>untuk memanggil perintah terakhir dimulai dengan <beginning of command>.

misalnya jika Anda berlari

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

!ta akan mengeksekusi tail file.txt

Dan
sumber
1

tl; dr !!hanya menambahkan perintah terakhir ke perintah Anda saat ini. <backtick>!!<backtick> jalankan perintah terakhir dan tambahkan output ke perintah Anda saat ini.

Sebenarnya ada 2 varian:

  1. Perintah terakhir itu sendiri
  2. Hasil dari perintah terakhir

Izinkan saya menunjukkan kepada Anda 2 contoh:

Contoh 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Seperti yang Anda lihat di atas, saya menjalankan perintah dan pada dasarnya hanya menambahkan perintah terakhir.

Variasi lain

Contoh 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"
Pradyumna Shembekar
sumber
+1 untuk vi `!!`. Sangat berguna
le_daim
0

Ketika saya menggunakan emulator xterm yang baik, misalnya dempul, cara favorit saya untuk melanjutkan adalah memilih perintah termasuk umpan baris, salin ke clipboard dan kemudian gunakan klik kanan pada mouse untuk menempelkannya. Ini mengulangi perintah dalam satu klik. Ini juga berfungsi dengan baik untuk urutan perintah yang dipisahkan oleh semi-titik dua.

Bernard Perrin
sumber
0

Anda dapat menggunakan !nuntuk menjalankan perintah ke-n di terminal. di mana 'n' adalah no baris historyperintah.

Ravi Sevta
sumber
Shell mana yang mengembang !?ke perintah terakhir? Apakah Anda yakin tidak mencampuradukkannya !!(yang sudah tercakup dalam jawaban lain)?
Anthony Geoghegan
maaf, sebenarnya saya sedang bereksperimen perintah ini pada waktu itu. silakan periksa jawaban yang diedit. @AnthonyGeoghegan
Ravi Sevta
Ini adalah jalan pintas yang saya cari. Terima kasih!
le_daim
0
  • Ketikkan History dan catat nomor di depan perintah yang Anda jalankan dan gunakan !number

  • Anda juga dapat menggunakan ! -1 (1 sebagai perintah terakhir yang Anda jalankan, ganti dengan nomor hitung yang Anda dapatkan saat melakukannya dari bawah agar yang terakhir dieksekusi sebagai 1)

  • ! -2 (kedua terakhir dan seterusnya)
Lovish
sumber
0

Ada beberapa lapisan di mana Anda dapat meminta perintah terakhir.

Editor baris

Editor baris (tempat Anda mengetik perintah) disediakan langsung oleh ksh, oleh pustaka baris baca di bash, dan oleh pustaka zle di zsh. Kerang lain, seperti dasbor mungkin tidak memiliki pustaka pengeditan untuk memahami kunci ini (kecuali dikompilasi dengan --with-libeditopsi yang diaktifkan).

Ini bekerja di ksh, bash, zsh:

Ctrl- P# Mode Emacs (sebelumnya)
Ctrl- N# Mode Emacs (berikutnya)
ESC- k # vi mode ESC untuk pergi ke mode perintah dan k untuk naik
ESC- j # vi mode ESC untuk pergi ke mode perintah dan j untuk turun

sejarah

Sistem sejarah yang disediakan oleh banyak shell memungkinkan perluasan beberapa pintasan:

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

perintah

Ada beberapa perintah yang dapat mengambil perintah sejarah.

Seperti perintah cukup verbose (hanya untuk mencetak):

history 2 | head -n-1

atau perintah yang lebih tua dan karena itu biasanya lebih portabel fc(langsung dijalankan kembali):

fc -e - -1

Atau mungkin yang lebih sederhana fc -s -1, tetapi zsh tidak menerima opsi untuk fc.

Jika Anda ingin hanya mencetak perintah, gunakan: fc -nl -1 -1.

Untuk mengedit, mengatur FCEDITke editor teks (ex, ed, emacs, vi, dll) dan menggunakan fc langsung: fc -1.

Ishak
sumber