Saya sering menemukan diri saya dalam posisi berikut: Saya sudah mulai mengetik perintah panjang di bash prompt, tetapi setengah jalan saya menemukan saya perlu memeriksa sesuatu dengan perintah lain. Ini adalah masalah ketika saya berada di konsol (tidak ada X), yang sering terjadi, karena saya hanya memiliki cara tidak memuaskan berikut untuk melakukannya, yang saya tahu:
- Tekan ctrl+ alt+ F2dan masuklah ke konsol virtual lain, dan cari tahu apa yang saya inginkan, lalu kembali dan lanjutkan
- ctrl+ a, ketik echo + space+ enter, cari tahu apa yang saya inginkan, tekan ↑hingga saya menemukan perintah saya, ctrl+ a, delx 5, ctrl+ e, dan lanjutkan
- Sorot apa yang telah saya ketik sejauh ini dengan mouse saya (jika gpm sedang berjalan, seperti biasanya), tekan ctrl+ cuntuk menyela, cari tahu apa yang saya inginkan sambil berhati-hati untuk tidak menggunakan mouse saya untuk menyorot hal-hal, lalu tekan tombol tengah mouse pada prompt baru dan lanjutkan
- Berdoa kepada dewa-dewa command line bahwa perintah setengah-tertulis tidak akan memiliki efek buruk tetapi gagal, dan tekan enter dengan hati-hati, kemudian cari tahu apa yang saya inginkan, tekan uparrow sampai saya mendapatkan kembali perintah saya, dan lanjutkan
- Lompat ke mesin waktu saya, kembali ke masa lalu dan ingatkan diri saya untuk memulai layar sebelum mulai mengetik perintah, bepergian kembali ke masa sekarang, tekan ctrl+ a c, cari tahu apa yang saya inginkan, tekan ctrl+ a ctrl+a, dan lanjutkan
Jadi yang ingin saya ketahui adalah, adakah cara yang lebih elegan untuk melakukan ini? Semacam perintah subshell atau serupa?
Saya paling tertarik dengan metode yang tidak memerlukan persiapan atau pengaturan apa pun untuk berfungsi.
sumber
zsh
atasnya memotong seluruh baris, tetapi dibash
atasnya memotong mundur. Saya tidak pernah memperhatikan perbedaan itu sebelumnya^U
^K
akan memiliki efek yang sama^A
^K
tetapi sedikit lebih ergonomis, dan secara signifikan lebih nyamanscreen
.Lakukan ctrl-A untuk memulai baris, tambahkan hash dan tekan kembali - dengan cara ini akan tetap dalam sejarah perintah sebagai komentar dan Anda dapat kembali ke sana dengan kursor naik
EDIT: cukup perhatikan ini adalah varian yang sedikit lebih elegan di # 2;)
sumber
csh
atauzsh
karena mereka tidak mengizinkan komentar di shell interaktif. Dalamzsh
Anda perlu mengaktifkan pilihan yang tepat:setopt interactive_comments
.:
harus dianggap berbahaya untuk tujuan ini dan tidak pernah disarankan. Ini akan menjalankan semuanya setelah tanda titik koma, di dalam backticks dll dengan semua efek samping yang terkait.Tekan
Ctrl+A
,Ctrl+K
untuk pindah ke awal baris dan menghapus (bunuh) sampai akhir. Kemudian lakukan riset Anda, dan ketika siap untuk melanjutkan tekanCtrl+Y
(menarik) untuk mengembalikan garis Anda yang sudah disimpan (terbunuh).sumber
Di zsh, saya mengetik Ctrl+ Zuntuk "menangguhkan" perintah yang saya ketikkan dan ketik perintah lain. Setelah saya menjalankan perintah itu (atau membatalkannya dengan Ctrl+ C), perintah yang ditangguhkan kembali untuk edisi (bahkan mengingat posisi kursor). Sebagai kenyamanan tambahan, jika baris perintah kosong ketika saya mengetik Ctrl+ Z, kunci akan memanggil
bg
built-in sebagai gantinya (jadi dua kali lipat Ctrl+ Zmengirimkan perintah yang berjalan langsung ke latar belakang).Saya tidak tahu bagaimana melakukan sesuatu yang mirip di bash.
Dalam shell apa pun, Anda dapat menggunakan metode menambahkan
#
teknologi rendah di awal baris saat ini .sumber
zsh
memiliki fungsi untuk itu dibangun di sudah ? Ini dipanggilpush-line
dan yang perlu Anda lakukan hanyalah menggunakannyabindkey
untuk mendapatkannya.push-input
daripada dipush-line
sini,push-line
apakah sepertinya lebih tepat (mungkin versi lama dari zsh hanya punyapush-input
?). Tapi itu bukan pengganti untuk sisa fungsi.push-line
tidak berguna pada baris kosong, setelahbg
padaCtrl+Z
hanya berguna ketika saya baru saja menunda proses itu denganCtrl+Z
) dan mnemonic (Saya baik latar belakang proses atau baris perintah parsial).push-input
menangguhkan seluruh buffer input, sedangkanpush-line
hanya menangguhkan baris saat ini. Jika saya mengetik perintah multiline, saya ingin menunda seluruh perintah, begitupush-input
juga yang benar. Saya menemukanpush-input
lebih sering berguna daripadapush-line
(jika saya ingin menunda baris dalam buffer input multiline, saya hanya dapat menavigasi ke awal baris dan memasukkan baris baru), jadi saya sebenarnya bertanya-tanya mengapapush-line
mendapat keybinding default dan tidakpush-input
.Di bash, cukup ketik Alt+ #.
Kemudian ketika Anda siap, tekan Uplalu Alt+ #.
Yang pertama menempatkan a
#
di awal baris untuk mengubahnya menjadi komentar, kemudian menerima baris, seolah-olah Anda telah menekan Enter.Kemudian, ketika Anda melakukannya untuk kedua kalinya, ia melihat garis sudah memiliki
#
di awal, sehingga menghapusnya, dan menerimanya, lagi menyelamatkan Anda Enterkunci.Jika kedua kalinya hanya memasukkan yang lain
#
, maka Anda harus mengetik Alt+ - Alt+ #sebagai gantinya.Anda dapat membuat zsh melakukan hal yang sama dengan meletakkan
di ~ / .zshrc Anda.
Atau, jika Anda menggunakan vi bindings, Anda dapat mengetik #dari mode perintah di bash dan zsh.
sumber
Esc+1
kemudianAlt
+#
untuk beralih.Salah satu fitur favorit saya
zsh
adalah fungsi push-line bawaan yang menangani ini tanpa ada peretasan di jawaban lain di sini. Saya sudah terikat ke Ctrl+ ldi.zshrc
file saya seperti ini:Kemudian ketika saya mengetikkan beberapa perintah dan perlu melakukan sesuatu yang lain dengan sangat cepat, saya dapat memohonnya dengan satu kunci dan mendapatkan prompt kosong. Setelah menjalankan perintah lain, prompt secara otomatis diisi dengan apa yang saya ketikkan sebelumnya.
Anda bahkan dapat rantai beberapa lapisan ini dan perintah akan kembali kepada Anda dalam urutan terbalik sehingga Anda mendorong mereka ke dalam antrian.
sumber
Ctrl+Q
danESC q
secara default (dalam mode emacs).push-line-or-edit
widget, yang tidak terikat keymap apa pun secara default. Pada prompt tingkat atas, ia melakukan hal yang samapush-line
, tetapi pada tingkat prompt mana pun yang lebih rendah itu mengonversi seluruh perintah yang dimasukkan ke buffer multi-line. Dua fungsi hebat pada satu keybinding! Saya dapat merekomendasikan mengikatpush-line-or-edit
bukan polospush-line
. Anda tidak kehilangan apa-apa, dan mendapatkan fungsionalitas yang bermanfaat.Selain ctrl- a ctrl- ktrik, jika Anda berada di layar, cukup ctrl- a duntuk melepaskan lalu pasang kembali
screen -r
Anda juga bisa membuka jendela lain dengan ctrl+a c
sumber
Ctrl+A c
.Cara alternatif, tidak sempurna, tekan
Ctrl-X
Ctrl-E
. Ini akan membuka editor default Anda yang berisi perintah setengah mengetik Anda. Kemudian Anda dapat menyimpan perintah Anda ke file atau membuka shell baru dari dalam editor Anda. Ketika Anda keluar dari shell baru itu akan mengembalikan Anda ke editor dan menyimpan konten akan secara otomatis menjalankannya.Ini tidak sempurna karena tidak mengembalikan Anda ke shell asli Anda, tetapi memaksa eksekusi perintah atau benar-benar membuangnya. Tetapi tidak ada pilihan sementara atau membunuh buffer yang perlu dikhawatirkan, dan ada juga beberapa penyesuaian yang bagus, misalnya jika editor = vi
sumber
sudo update-alternatives --config editor
dan pilih editor favorit Anda. Untuk sistem lain atur variabel lingkungan EDITOR atau VISUAL ke editor favorit Anda, mis. Tambahkanexport EDITOR=/usr/bin/nano
di .bashrc Anda.Mirip dengan metode menambahkan
#
pada awal baris, ada metode yang bisa dibilang lebih sederhana yang saya gunakan yang tidak perlu kembali ke awal baris:Cukup tambahkan kutipan terbuka dan jangan tutup, apakah tunggal atau ganda.
Lalu tekan Enter.
Lalu tekan CtrlC.
Perintah parsial disimpan dalam histori perintah (tersedia melalui panah atas) tetapi sebenarnya tidak dieksekusi.
sumber
Menggunakan zsh, jika Anda mengetik
<ESC> q
(melarikan diri, lalu Q), baris prompt Anda akan dipotong, sehingga Anda dapat mengetik perintah lain. Anda akan secara otomatis mendapatkan kembali teks terpotong Anda di prompt berikutnya.Ia dapat mengingat beberapa baris pada saat yang bersamaan, sehingga Anda dapat menggunakannya saat sebuah garis sedang menunggu Anda. Anda bahkan dapat menggunakannya pada baris kosong untuk menunda resume dari garis potong Anda.
Ini bukan cara yang paling efisien jika Anda harus menggunakan beberapa perintah untuk pemeriksaan / persiapan (Anda harus mengetik ulang
<ESC> q
sebelum setiap perintah). Tapi saya pikir itu mungkin untuk mengikatnya ke jalan pintas yang lebih pendek.Jika Anda hanya ingin memeriksa manual, ketik
<ESC> h
(escape, lalu H). Itu akan menjalankanrun-help
built-in, dengan kata pertama dari baris perintah sebagai argumen. Anda akan menemukan kembali garis Anda utuh setelah selesai.sumber
M-q
bukannya<ESC> q