Dengan BASH setelah "menggulir" ke perintah sebelumnya ... bagaimana cara melanjutkan ke yang berikutnya dalam sejarah ini?

59

Maaf, judul ini bukan yang paling elegan yang pernah saya rancang.

Tetapi saya berasumsi banyak orang akan bertanya-tanya tentang hal ini, dan pertanyaan saya mungkin merupakan penipuan ... yang bisa saya katakan adalah saya belum menemukannya.

Ketika saya mengatakan "menggulir" ke atas, maksud saya menggunakan tombol "panah atas" pada keyboard, yang jelas menggulung Anda ke atas melalui sejarah, mulai dari perintah terbaru.

Jadi Anda menemukan perintah, mungkin 30 perintah kembali ... dan Anda menjalankannya. Dan kemudian Anda ingin menjalankan perintah yang awalnya datang setelah itu ... apakah ada cara cepat untuk melakukan ini? Atau bagaimana mereka yang lancar dalam BASH melakukan ini?

mike rodent
sumber

Jawaban:

96

Menjalankan perintah dengan Ctrl+ oalih-alih Enterakan menjalankan perintah dari histori dan kemudian mengantri yang berikutnya alih-alih kembali ke depan bash history.

Jon Reinhold
sumber
2
Saya baru saja mencoba ini di bash saya sendiri berjalan dalam xterm di NetBSD, dan itu tidak berhasil! Apakah ada pengaturan yang dapat memengaruhi ini? Saya tidak punya file .inputrc. Co tidak disebutkan dalam halaman manual untuk readline (3).
Rhialto
@Rhialto Apakah Anda menggunakan vipengeditan baris (diaktifkan dengan set -o vi) atau emacs? Karena Ctrl-Otidak akan bekerja dengan mantan sejauh yang saya tahu.
B Layer
... tapi ini dapat diatasi dengan perintah: bind "\C-o":operate-and-get-next(atau menambahkan semuanya setelah bindke ~/.inputrc)
B Lapisan
1
Saya menemukan apa masalah saya: ^ O diambil sebagai karakter Flush Output (tidak didukung di Linux), dan readline tidak menonaktifkan ini saat sedang aktif. Saya menyediakan tambalan sederhana tetapi pemelihara bash dan readline menyatakan bahwa ini bukan bug. Saya tidak setuju. Lihat lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto
19

Jawaban Jon Reinhold bagus, tetapi ada solusi yang jauh lebih kuat yang akan saya sarankan. Saya juga memiliki komentar tentang gotcha dalam jawaban Jon, tetapi saya tidak memiliki reputasi yang cukup untuk dapat berkomentar secara langsung, jadi @Jon Reinhold, jika Anda membaca ini, harap berikan komentar saya kepada Anda di bawah ini.

Bash termasuk perintah fc, yang mengambil nomor baris parameter dari daftar riwayat bash. Ini kemudian membuka editor default Anda dengan baris-baris itu sebagai teks. Pada titik itu, Anda dapat mengedit baris secara opsional. Lalu, ketika Anda keluar dari editor, bash mengeksekusi baris itu!

Contoh pengeditan yang mungkin ingin Anda buat adalah menambahkan ke semua kecuali baris terakhir seperti "; baca -p" selanjutnya ... ". Itu akan menyebabkan bash untuk mengeksekusi setiap baris, dan meminta Anda sebelum melanjutkan.

Komentar untuk Jon Reinhold: Jawaban yang bagus, tetapi Anda harus membuatnya memenuhi syarat karena jika pengguna telah menetapkan variabel bash HISTCONTROL untuk dimasukkan erasedups, maka setelah melakukan C-opengguna akan bingung karena alih-alih perintah berikutnya yang diharapkan dalam sejarah ditampilkan, yang setelah itu akan ditampilkan. Ini karena bash telah menghapus instance asli dari perintah yang dieksekusi, dan dengan demikian semua perintah sesudahnya telah bergeser ke atas satu baris, yaitu. ke satu nomor indeks yang lebih rendah dalam daftar riwayat.

pengguna1404316
sumber
terima kasih, dalam mencoba menemukan jawabannya dengan mencari saya menemukan perintah "fc". Bagi saya ini merupakan tahap berikutnya dalam langkah lambat bayi BASH orang baru di sepanjang jalan kemuliaan menuju PENGETAHUAN. Saya ingin langkah bayi pertama .
mike rodent
3
@mikerodent No. Jadi itu terjadi fcsebelum keduanya Ctl-odan bashitu sendiri. (Bertentangan dengan jawaban ini juga kurang bermanfaat.)
kubanczyk
1
Masalah dengan erasedupsjelas adalah bug bash ( mungkin ada ketentuan untuk situasi ini). Bagus untuk tahu.
Alex
2
@kubanczyk Terserah debat. Jika itu adalah perintah yang rumit dan rumit tergantung pada apa yang perlu diperbaiki, akan jauh lebih cepat bagi saya untuk menggunakan editor pilihan saya untuk memperbarui perintah. Itu juga akan lebih mudah.
Pryftan
14

Cara lain untuk mencapai perilaku yang Anda inginkan adalah dengan mengenal pintasan readline bash (yang CTRL- osaya percaya) dan mencari riwayat bash.

Pencarian riwayat

CTRL- rmembawa Anda ke pencarian sejarah perintah bash, di mana Anda dapat mulai mengetik perintah yang Anda cari dan bash akan melengkapi perintah secara otomatis untuk Anda. Fungsionalitas autocomplete sangat bagus. Ketika perintah yang ingin Anda jalankan adalah pada baris input, Anda dapat ENTERmenjalankan perintah, atau tekan CTRL- euntuk memindahkan kursor ke akhir baris perintah dan keluar dari mode pencarian riwayat.

Yang keren dengan CTRL- epada titik ini adalah bahwa buffer sejarah diatur secara kontekstual ke perintah ini. Perintah berikutnya dan sebelumnya sekarang adalah perintah yang dijalankan sebelum dan sesudah baris yang ditemukan oleh pencarian riwayat. Anda dapat menekan panah atas atau bawah dan ambil perintah berikutnya.

Pencarian riwayat sangat kuat dan cara yang bagus untuk menghindari menggunakan panah atas untuk mendapatkan jalan kembali ke perintah di tempat pertama. Pencarian riwayat cepat dapat menghemat banyak waktu pencarian secara manual melalui sejarah dan kemudian Anda dapat melanjutkan dengan CTRL- oseperti yang ditunjukkan Jon di atas.

Baca Potongan Singkat

Jika Anda ingin meningkatkan bash-fu Anda secara keseluruhan, saya akan merekomendasikan untuk memberikan pintasan readline untuk bidikan tombol panah. Anda mungkin menemukan bahwa mereka lebih nyaman dan memungkinkan Anda untuk meningkatkan kecepatan mengetik Anda, tetapi tentu saja YMMV. Berikut adalah beberapa lagi:

  1. CTRL- nuntuk perintah selanjutnya (panah bawah setara)
  2. CTRL- puntuk perintah sebelumnya (sama dengan panah atas)
  3. CTRL- bkembali karakter (setara panah kiri)
  4. CTRL- fmeneruskan karakter (setara panah kanan)

Pintasan readline ini (bersama dengan CTRL- aawal baris dan CTRL- eakhir baris) akan meningkatkan kecepatan dan efisiensi Anda pada imo baris perintah.

111 ---
sumber
2
Saya tidak tahu Saya menemukan menggunakan tombol pengubah lebih lambat dari panah atau tekan satu tombol lainnya. Adapun EOL / dll. Saya cenderung menggunakan kunci home / end (stty -a menunjukkan beberapa hal yang cukup praktis juga, tentu saja).
Pryftan
@Pryftan Cukup adil, kalimat terakhir disajikan sebagai pendapat (lihat 'imo'). Saya percaya bahwa tetap menggunakan deretan keyboard di rumah untuk jangka panjang adalah strategi yang baik untuk bekerja di terminal atau tugas-tugas intensif pengetikan lainnya. Beberapa orang memiliki keyboard di mana tombol panah lebih dekat dengan karakter lain, dalam hal ini mungkin pintasan readline bukan kenyamanan yang menarik. Saya akan mengedit jawaban untuk menjadikan poin terakhir ini lebih jelas sebagai pernyataan pendapat.
111 ---
1
@datUser Tbh ​​Saya melewatkan 'imo' (atau jika saya tidak saya mengabaikannya - sangat mungkin). Yang benar adalah pencarian balik berguna (memiliki +1) jika itu bekerja untuk Anda. Tentu saja fc juga sesuatu (seperti yang sudah disebutkan) dan begitu juga menggunakan! (dll.). Banyak cara menguliti kucing di Unices. Adapun keyboard itu cukup benar juga: Saya memiliki keyboard Unicomp (suka dan mengembalikan kenangan) tetapi tentu saja ada juga keyboard lain yang perlu dipertimbangkan untuk tidak menyebutkan Dvorak. Pada akhirnya, semakin banyak opsi yang Anda miliki semakin baik Anda pergi dan semakin mudah pekerjaan Anda (atau bermain) :)
Pryftan