Bagaimana saya bisa bergerak di sekitar bash commandline secara efisien?

19

Jadi saya menggunakan di updalam shell saya (Bash pada OSX atau Ubuntu, sebagian besar) tetapi beberapa waktu saya tahu bahwa saya ingin barang-barang setelah lokasi kursor saat ini. Apakah ada cara untuk membuat garis saya lengkap dengan garis di atas? Memukul upkemudian leftmenjengkelkan.

Trik lain juga akan keren, kecuali tab, yang kita semua ketahui :)

Berikut ini contoh (permintaan per ~ dukun):

Saya mengetik mkdir /where/the/hell/is/that/thingdan kemudian saya ingin cd ke direktori yang sama. Tapi sekarang saya tahu tentang meta-b :)

Dan Rosenstark
sumber
1
contoh eksplisit akan luar biasa.
quack quixote
@ ~ dukun melakukan contoh sekarang
Dan Rosenstark
1
inilah pertanyaan terkait (duplikat), dengan jawaban yang cukup bagus: superuser.com/questions/124336/...
cregox

Jawaban:

11

Coba ini:

mkdir /where/the/hell/is/that/thing

lalu tekan alt+.

tergantung pada OS dan terminal Anda mungkin harus mengetik esckemudian.

Anda juga dapat menekan alt+ 1+ .untuk memilih argumen tertentu sebelumnya.

Ini jauh lebih baik daripada !! atau! $ karena Anda benar-benar dapat melihat apa yang akan Anda jalankan, dan itu membutuhkan waktu penekanan tombol yang lebih sedikit.

sunting: sebenarnya metatidak alt, jadi mungkin juga bekerja dengan tombol "windows" tergantung pada bagaimana keyboard Anda diatur ..

pengguna23307
sumber
menarik! tidak tahu tentang itu.
quack quixote
2
@ hanya ini luar biasa. Di OSX, meta melarikan diri.
Dan Rosenstark
@yar dengan OS X Terminal ada juga pengaturan preferensi di bawah 'Pengaturan' -> 'Keyboard' untuk 'menggunakan opsi sebagai kunci meta'.
ThomasW
Terima kasih @ Thomas saya harus kembali ke hal ini. Saya di baris perintah setiap hari, tetapi menggunakan sangat sedikit trik.
Dan Rosenstark
28

Anda harus membaca man bash di sistem Anda, khususnya bagian tentang Readline , karena ini adalah mekanisme input interaktif bash. The Bash manual di gnu.org memiliki bagian bagus di Commandline Editing yang akan membantu mengisi beberapa kesenjangan.

Secara default, Anda dapat menggunakan ini untuk bergerak di commandline (cukup cantumkan beberapa di sini; lihat tautan untuk daftar lengkap):

  • Ctrl+ apindah ke awal baris (atau Hometergantung pada pengaturan terminal)
  • Ctrl+ ebergerak ke akhir baris (atau End...)
  • Meta+ fbergerak maju "kata"
  • Meta+ bmemindahkan "kata" ke belakang

Anda dapat menggunakan ini untuk "membunuh" (alias "potong") teks dari baris:

  • Ctrl+ kmembunuh ("memotong") teks dari posisi kursor saat ini ke akhir baris
  • Ctrl+ yyanks ("pasta") teks yang terakhir terbunuh kembali ke buffer di kursor

Jadi, Anda dapat menggabungkan ini untuk memilih potongan dari beberapa baris perintah yang ingin Anda ulangi, membunuhnya, lalu menempelkannya ke akhir perintah berikutnya.


Sekarang, untuk membuatnya lebih menyenangkan, mari kita pertimbangkan Ekspansi Sejarah bash . Ini adalah bahwa !!bahwa jawaban Studer ini menyebutkan . Ekspansi sejarah dipecah menjadi perancang acara , perancang kata , dan pengubah .

Perancang acara terlihat seperti ini (sekali lagi, lihat tautan untuk daftar lengkap):

  • ! - memulai substitusi sejarah
  • !n- perintah ke-n dalam daftar riwayat bash, untuk beberapa bilangan bulat n (berfungsi untuk negatif juga)
  • !!- perintah sebelumnya; setara dengan!-1
  • !string- perintah terbaru yang dimulai dengan string

Penunjuk kata memilih bagian-bagian tertentu dari suatu peristiwa. Gunakan :untuk memisahkan acara dari kata designator. Kata-kata diberi nomor dari 0 mulai dari awal baris, dan dimasukkan ke dalam baris saat ini dipisahkan oleh spasi tunggal.

  • $- menunjuk argumen terakhir (mis. argumen !!:$terakhir dari perintah terakhir; dapat disingkat menjadi !$)
  • n- menunjuk kata ke-n (mis. !str:2adalah argumen ke-2 dari perintah terbaru yang dimulai dengan str ; !!:0adalah perintah dari perintah terakhir)

Jadi, untuk menindaklanjuti contoh Anda, jika perintah terakhir Anda mkdir /some/really/long/path, hanya menjalankan !!akan menjalankan kembali perintah itu lagi. Tetapi Anda ingin cdmasuk ke jalur itu:

$ cd !$

Sekarang katakanlah Anda melakukan beberapa perintah lain dan kemudian ingin merujuk kembali ke jalur itu lagi. Jika itu adalah perintah mkdir terakhir yang Anda jalankan, Anda dapat menggunakan ini untuk mengulangi jalur itu:

$ tar czf ~/foo.tgz !mkdir:$
quack quixote
sumber
Anda juga dapat mengikat ini (dan perintah Readline lainnya) ke kombinasi tombol apa pun yang Anda suka; lihat bagian 8.4 manual, Perintah Readline Bindable : gnu.org/software/bash/manual/… dan bagian 8.3, Readline Init File: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote
terima kasih itu sangat membantu. Meskipun "membaca manual" agak diharapkan, menyebutkan dasar bergerak di sekitar binding memang membantu. Bahkan hanya dengan mengetahui ctrl-a mungkin penghematan nyata.
Dan Rosenstark
@ quack, tidak masalah, saya mendapatkan revisi kemudian, pada kenyataannya :)
Dan Rosenstark
1
juga catat bind -patau bind -Pakan cetak ikatan kunci Anda saat ini; itulah referensi utama untuk apa yang digunakan bash Anda .
quack quixote
1
Saya pikir jawaban ini telah berkembang: hal-hal tentang Ekspansi Sejarah hebat.
Dan Rosenstark
6

Jika Anda adalah pengguna vi, Anda dapat memasukkan shell ke mode vi dengan mengetik set -o vi.

Anda kemudian dapat melakukan segala macam hal yang kuat di baris perintah setelah mengetik Esc + k.

Yang paling saya gunakan adalah Esc+Kmaka /setiap teks yang diketik setelah slash akan digunakan untuk mencari melalui sejarah baris perintah Anda.

mis. Esc + k /smbclient akan memberikan perintah smbclient terakhir yang Anda ketikkan. Anda dapat menggulir semua pencarian menggunakan tombol vi standar ( jdan kuntuk naik dan turun tapi saya pikir panah atas dan bawah juga berfungsi).

Bantuan lebih lanjut di sini , ada juga beberapa hal bash inbuilt di tautan yang mungkin lebih dari yang Anda cari.

Cheers, Stu.

Stuart Brock
sumber
sementara mode vi tidak berguna bagi saya, karena saya belum melangkah ke vi, tinta l luar biasa. Terima kasih untuk itu!
Dan Rosenstark
1
Setara tanpa mode vi adalah ctrl-r. Ketik itu, dan kemudian bagian dari perintah sebelumnya. Ini akan memunculkan kejadian terakhir dari apa yang diketik. Tekan ctrl-r lagi untuk sampai ke yang berikutnya. Sangat berguna.
Nerdfest
3

Anda dapat menggunakan !!yang mewakili perintah terakhir:

% uji
% gema !!
> tes
Studer
sumber
menarik. Tidak yakin bahwa saya ingin memanipulasi string itu menggunakan ... apa?
Dan Rosenstark
ini adalah bagian dari fasilitas sejarah bash: gnu.org/software/bash/manual/… .. khususnya ekspansi sejarah: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!adalah sinonim untuk !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote
2
Ini sangat berguna ketika Anda lupa menggunakan sudo: yaitu sudo !! - $ lebih / etc / sudoers / etc / sudoers: Izin ditolak $ sudo !! sudo lagi / etc / sudoers [sudo] kata sandi untuk ..: # / etc / sudoers ... ... ...
user9632
@wookiebreath, terima kasih untuk itu, saya akan memilih jawaban ini sekarang
Dan Rosenstark
0

Dalam contoh yang Anda berikan, gunakan! $ Untuk mewakili parameter terakhir dari perintah sebelumnya:

mkdir / sesuatu / sesuatu yang lain

cd! $

Anda juga dapat menggunakan variasi bernomor untuk mengeluarkan parameter spesifik dari perintah sebelumnya.

Nerdfest
sumber
0

Baru-baru ini saya menemukan cheat-sheet readline ini sangat berguna. Banyak hal yang tidak saya ketahui. Saya biasa menggunakan !$semua waktu sampai saya tahu tentang Alt+ ., yang sekarang saya gunakan sepanjang waktu. :)

fredden
sumber