Tampaknya ada cukup banyak informasi tentang cara mengedit dan mengeksekusi perintah menggunakan editor Anda menggunakan "edit-dan-eksekusi-perintah (Cx Ce)", tetapi apa yang ingin saya capai adalah mengambil perintah shell saat ini, terapkan penyaringan tertentu (menggunakan skrip) dan kemudian mengembalikannya untuk meminta persetujuan / perubahan manual lebih lanjut sebelum eksekusi. Apakah ini mungkin dengan bash?
13
edit-and-execute-command
.Escape
+V
, tetapi masih akan menjalankan perintah. Jadi untuk solusinya, saya akan menambahkanecho
di depan untuk menjalankannya dengan mencetak perintah ke konsol untuk ditinjau.Jawaban:
Pembaruan terbaru tentang pengalaman saya
Bagian
0"+y$dd
dalam pemetaan berikut ini adalah sesuatu yang harus Anda pikirkan dan sesuaikan dengan selera / alur kerja / pengalaman Anda.Sebagai contoh, sangat sering saya menemukan diri saya berakhir dengan beberapa baris di buffer, di mana saya hanya ingin mengeksekusi satu kursor aktif; dalam hal ini saya dapat menggunakan
0"+y$dd:%d<CR>
sebagai gantinya0"+y$dd
.Dan ini hanyalah salah satu skenario yang mungkin.
Jawaban akhir untuk mereka yang suka
vim
vim
sebagaiEDITOR
/ AndaVISUAL
, sehingga saat mengedit baris perintah, Anda akan menggunakanvim
untuk mengeditnya.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
Anda~/.vimrc
ke peta Leaderd(yang jarang Anda gunakan saat mengedit perintah) untuk tindakan "hapus baris saat ini ke dalam+
register tanpa EOL tertinggal".+
atau*
dalam pemetaan di atas; cara untuk menempel ke terminal kemungkinan akan berbeda; Anda memerlukan+clipboard
opsi untuk register ini tersedia .vim
editor, tekan EscapeLeaderd.Jawaban asli
Saya sering perlu melakukan hal yang sama, dan saya melakukannya sebagai berikut. (Saya biasanya menggunakan
set -o vi
inbash
, jadi poin 1 dan 2 berikut ini berbeda jika Anda menggunakanset -o emacs
, default; berdasarkan pertanyaan Anda sepertinya poin 1 dan 2 disatukan dalam Ctrl+ xdiikuti oleh Ctrl+ e, yang lebih sulit untuk mengetik, ya .)(Di sinilah Anda mengajukan pertanyaan.)
URxvt
.Jelas ini hanya solusi, yang terdiri dari menyalin perintah yang diedit ke clipboard sebelum menghapus seluruh perintah, sehingga tidak ada yang dieksekusi saat keluar dari editor; namun itu yang terbaik yang bisa saya dapatkan untuk diri saya sendiri.
Memperbarui
Karena saya
EDITOR
(danVISUAL
) sama denganvim
, ketika saya mengedit perintah, saya mengeditnyavim
.Dalam hal ini, saya perhatikan bahwa buffer bernama
/tmp/bash-fc.random
, di manarandom
string acak alfanumerik 6 karakter.Ini memberi ruang bagi banyak kemungkinan, jika Anda gunakan
vim
sebagai editor, karena Anda dapat menentukan beberapa pemetaan di Anda.vimrc
untuk menjalankan seluruh urutan Escape0"+y$dd:wq. Misalnya, satu perintah yang jarang Anda gunakan saat mengedit baris perintah adalah Leaderd; karena itu Anda dapat meletakkanmap
ping berikut di.vimrc
file Andasehingga langkah 4 dalam resep di atas menjadi
sumber
Tidak mungkin melakukannya di Bash / readline tetapi dimungkinkan di zsh menggunakan
edit-command-line
perintah:Sekarang tekan Control- x Control- euntuk membuka editor Anda, edit baris, tinggalkan editor - Anda akan melihat baris perintah yang diperbarui tetapi tidak akan dieksekusi secara otomatis.
sumber
Sekarang saya berpikir tentang hal itu, mungkin variasi dari apa yang disarankan @kenorb dalam komentar adalah solusi terbaik (karena sepertinya tidak ada solusi), jika kita ingin tetap berpegang pada
bash
.Apa yang dapat Anda lakukan adalah menambahkan
#
(karakter komentar dibash
) ke perintah, bukanecho
. Kemudian ketika Anda keluar dari exitor, perintahnya tidak akan efektif, dan Anda hanya perlu menekan arrow up(atau k, jika Anda menggunakanset -o vi
), hapus#
dan konfirmasikan.Perhatikan bahwa strategi ini hanya menambahkan beberapa penekanan tombol, sehingga ini bisa sangat efisien, tergantung pada tingkat pengetikan Anda.
sumber
Potongan-potongan ini mungkin membuat Anda lebih dekat:
a) mengganti ikatan normal untuk baris baru baris baru (ctrl-M)
bind -x '"\C-M":date"
b) ambil garis saat ini dari riwayat menggunakan
!#
ganti tanggal dengan skrip apa pun yang Anda inginkan.
c) edit secara manual
d) jika perlu, entah bagaimana mengikat
!!:p
yang mencetak perintah baru ke baris perintah tetapi tidak menjalankannya, sehingga memungkinkan Anda mengeditnya secara manual.e) menggunakan ctrl-J mengirimkan perintah yang diedit daripada baris baru
atau mereka mungkin tidak ....
sumber
Ada opsi dalam bash untuk memodifikasi perintah dari histori tanpa menjalankannya. Saya tidak yakin apakah mungkin menggunakan skrip untuk ini, sepertinya tidak mungkin. Meskipun, Anda dapat membuat modifikasi menggunakan pengubah riwayat.
Berikut tampilannya:
sumber
Saya ingin mengarahkan Anda ke kerangka kerja Composure untuk Bash (saya tidak berafiliasi dengannya): https://github.com/erichs/composure
Ini menyediakan
draft
danrevise
fungsi-fungsi yang terdengar seperti mereka dapat membantu dengan apa yang Anda coba lakukan. Berikut ini kutipan (panjang) dari file readme proyek:sumber
Tampaknya tidak mungkin dengan pintasan keyboard, setidaknya:
sumber