Terminal: awalan perintah sebelumnya?

8

Sering di Terminal (meskipun saya sepenuhnya berharap jawaban apa pun akan bekerja di bash dan sebagian besar lainnya), saya mengetik beberapa perintah, dan kemudian mendapatkan semacam kesalahan izin karena tidak ada sudo.

Oke, jadi tekan 'atas', tahan / palu 'kiri', ketik sudodan tekan 'enter'.

Itu menyebalkan. Terlebih lagi, semakin lama perintahnya.

Perhatikan bahwa hilang sudoadalah kasus terburuk; salah ketik yang lebih dekat dengan awal daripada akhir sama-sama menjengkelkan .

Apa yang saya inginkan, adalah cara untuk melakukan semacam keystroke 'atas dan di rumah'. Sebenarnya, mungkin kedua pukulan itu akan melakukannya - tetapi keyboard Macbook saya tidak memiliki Rumah, jadi saya tidak dapat mencoba.

Poin bonus untuk cara memasukkan sudodan menekan 'masuk' juga secara ajaib, misalnya oleh CMD + Shift + S.


Apakah ini bisa dilakukan, atau saya bermimpi?

OJFord
sumber

Jawaban:

16

Cukup gunakan UPdan CTRL-A.

Keduanya !sudodan sudo !!fungsinya mudah. Dengan perbedaan:

  • sudo !!akan mengeksekusi perintah terakhir yang diambil dari sejarah dengan sudodi awal.

  • !sudoakan menjalankan perintah terakhir dalam sejarah yang dimulai dengan sudo.

  • Biasanya CTRL-Amembawa Anda di awal baris di terminal linux dan CTRL-Esampai akhir.
    Jika mau, Anda dapat terus menggunakan strategi Anda. Anda hanya perlu menemukan pintasan sistem Anda. Anda dapat menemukan daftar jalan pintas di lingkungan grafis dan teks misalnya di sini .

Hanya peringatan : sudo !!dan !sudofungsinya sangat cepat dan Anda tidak memiliki kontrol visual terhadap garis yang Anda jalankan sebagai superuser . Ini kadang-kadang bisa berbahaya . Khususnya jika Anda mengalami kesalahan cetak.

Mari kita lakukan contoh dramatis:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

Terlambat Anda baru saja menghapus direktori home Anda dan semua subfolder !! .

Saat Anda menulis perintah dengan spasi sebagai karakter pertama, kemungkinan itu tidak akan selesai dalam sejarah. Ini tergantung dari nilai variabel $ HISTCONTROL. Jika daftar nilainya menyertakan ignorespace (atau ignoreboth ) garis-garis yang dimulai dengan karakter spasi tidak disimpan dalam daftar sejarah. Begitu juga dengan sudo !! Anda akan menjalankan perintah terakhir sebelumnya.

Anda dapat membayangkan situasi yang sama dengan !sudoitu, itu akan mengeksekusi perintah terakhir dimulai dengan sudodicatat dalam sejarah, tetapi jika yang terakhir yang Anda ingat dimulai dengan spasi ... sekarang Anda tahu Anda akan menggunakan yang lain.

Catatan terakhir: lebih sedikit kesalahan dramatis Anda, lebih bisa keliru karena bisa lewat tanpa Anda sadari ... dan Anda akan berisiko dipanggil untuk membayar semua bunga tagihan yang tidak dapat Anda ingat.


Pembaruan (Bash hebat):
dengan versi terbaru dari Bash dimungkinkan untuk memperbaiki perilaku berbahaya ini dengan perintah berikut yang saya sarankan untuk dimasukkan ke dalam ~/.bashrcfile:

shopt -s histverify

Dari man bashAnda bisa membaca

Jika opsi histverify shell diaktifkan dan readline sedang digunakan, pergantian riwayat tidak segera diteruskan ke parser shell. Alih-alih, baris yang diperluas dimuat ulang ke buffer pengeditan readline untuk modifikasi lebih lanjut.

Sehingga Anda dapat membaca, dan memodifikasi saat dibutuhkan, perintah yang akan Anda jalankan.
Karena ini bukan pengaturan default di banyak distribusi, kami masih harus mengingatnya ketika kami menggunakan akun lain.

Cepat
sumber
1
Saya tidak ingat apakah itu Ctrl + A atau Cmd + A, tetapi pintasan ini adalah apa yang biasanya saya gunakan ketika saya dulu bekerja pada OS X. Perhatikan bahwa Ctrl + A membuat Anda memulai perintah seperti tombol "Home" dan Ctrl + E membawa Anda ke akhir perintah seperti tombol "End". Saya biasanya ragu untuk menggunakan !!terutama dalam kombinasi dengan sudo, kalau-kalau ternyata perintah sebelumnya bukan yang saya pikir seharusnya.
Lie Ryan
1
CTRL + A tepat untuk Mac OS X, saya menggunakannya sepanjang waktu.
Octavia Togami
@KenzieTogami Terima kasih atas konfirmasi yang saya perbarui jawabannya.
Hastur
5

Berikut adalah beberapa kombinasi keyboard umum yang digunakan oleh banyak program Mac dan Linux (tidak yakin yang diikuti oleh sebagian besar aplikasi Windows):

  • CTRL-A - Bawa kursor ke awal baris saat ini
  • CTRL-E - Bawa kursor ke akhir baris saat ini
  • CTRL-Left - Pindahkan kursor ke belakang satu kata
  • CTRL-Right - Pindahkan kursor ke depan satu kata
Jwosty
sumber
1
Juga, tombol Homedan End.
Bob
@ Bob saya memang menyebutkan orang-orang di OP saya. Tidak ada di keyboard Apple.
OJFord
@OllieFord Ah, maaf. Saya agak membaca skim itu.
Bob
4

Menggunakan

sudo !!

The !!akan digantikan oleh perintah sebelumnya lengkap.

Cyrus
sumber
Anda baru saja mengambil semua poin bonus saya dalam sekali gerakan!
OJFord
3

@WChargin benar tentang !sudo, jadi saya mengubah jawaban saya ...

sudo !! adalah jawaban yang benar, seperti yang banyak dikatakan.

Untuk jaga-jaga, saya menempel di sini berikut ini, sehubungan dengan historyperintah, dan bagaimana !perintah itu bekerja. Saya harap ini membantu.


Perintah sejarah

Perintah histori dapat digunakan untuk daftar log Bash dari perintah yang telah Anda ketik:

Log ini disebut "sejarah". Untuk mengaksesnya ketik:

history n 

Ini hanya akan mencantumkan n perintah terakhir. Ketik "riwayat" (tanpa opsi) untuk melihat seluruh daftar riwayat.

Anda juga dapat mengetik !nuntuk mengeksekusi nomor perintah n. Gunakan !!untuk menjalankan perintah terakhir yang Anda ketikkan.

!-nakan menjalankan perintah n kali sebelumnya (dengan kata lain !-1setara dengan !!).

!stringakan mengeksekusi perintah terakhir dimulai dengan "string" dan !?string?akan mengeksekusi perintah terakhir yang mengandung kata "string". Sebagai contoh:

!cd akan menjalankan kembali perintah yang Anda ketikkan terakhir dimulai dengan "cd".

commandName !*akan menjalankan "commandName" dengan argumen apa pun yang Anda gunakan pada perintah terakhir Anda. Ini mungkin berguna jika Anda membuat kesalahan ejaan, misalnya. Jika Anda mengetik:

emasc /home/fred/mywork.java /tmp/testme.java 

Dalam upaya untuk mengeksekusi emacs pada dua file di atas ini jelas akan gagal. Jadi yang bisa Anda lakukan adalah mengetik:

emacs !* 

Ini akan menjalankan emacs dengan argumen yang terakhir Anda ketikkan pada baris perintah. Dengan kata lain ini sama dengan mengetik:

emacs /home/fred/mywork.java /tmp/testme.java

~ Sejarah baris perintah

jimm-cl
sumber
Bukan itu yang !sudoterjadi. Penunjuk acara !sudoakan menjalankan perintah terakhir yang dimulai dengan sudo. Anda sedang mencari sudo !!!!penunjuk memperluas ke perintah sebelumnya.
wchargin
@WChargin, Anda benar :) Terima kasih telah menunjukkannya. Saya sedang mengedit jawaban saya.
jimm-cl
Suntingan yang bagus. Referensi selalu baik.
wchargin