Di Bash, ada beberapa operator praktis untuk mengulangi bagian dari perintah terakhir:
!^
memperluas argumen pertama dari perintah sebelumnya, misalnya,$ echo one "two three" one two three $ echo !^ echo one one
!$
memperluas argumen terakhir dari perintah sebelumnya, misalnya,$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
memperluas ke semua argumen dari perintah sebelumnya, misalnya,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Sejauh yang saya mengerti, ini adalah gula sintaksis untuk !!:^
, !!:$
dan !!:*
masing - masing, di mana !!
penunjuk acara yang memperluas perintah sebelumnya, dan ^
, $
dan *
penentu kata, lihat Manual Referensi Bash atau man bash
.)
Ini seringkali cukup berguna. Tetapi semakin keren dengan pintasan keyboard:
Ketika Anda menekan Alt+ .atau Alt+ _, argumen terakhir dari perintah sebelumnya dimasukkan dalam perintah saat ini, sama seperti jika Anda telah menulis
!$
pada titik itu.Dimungkinkan juga untuk menekan Alt+ Ctrl+ yuntuk memasukkan argumen pertama dari perintah sebelumnya, seolah-olah Anda telah menulis
!^
pada titik itu.
(Lihat Perpustakaan Readline GNU atau info readline
.)
Saya cenderung lebih suka pintasan keyboard daripada operator sejarah Bash, karena saya bisa melihat apa yang saya masukkan sebelum saya benar-benar menjalankan perintah. Namun, sepertinya tidak ada jalan pintas yang memungkinkan saya untuk memasukkan semua kata dari perintah sebelumnya, yaitu kata yang !*
berfungsi. Setidaknya saya tidak dapat menemukannya.
Apakah ada jalan pintas seperti itu? Jika tidak, apakah mungkin untuk mengonfigurasi perpustakaan readline untuk menambahkannya, dan bagaimana caranya?
sumber
zsh
, jika Anda mengetikecho !*
dan kemudian menekan TAB, Anda memiliki efek yang diinginkan. Secara umum, TAB sambil membaca akan memperluas semua yang dapat diperluas. Sangat berguna; mungkin bash akan memiliki beberapa konfigurasi dengan efek yang sama? @Seth, saya pikir ini adalah readline ke bash, bukan terminal emulator - meskipun tidak yakin.man bash
( di suatu tempat di garis 3030)\e.
dan\e_
dipetakan ke fungsi readlineyank-last-arg
dan\e\C-y
dipetakan keyank-nth-arg
. Sayangnya sepertinya tidak ada perintah (tunggal) yang menambahkan beberapa argumen sebelumnya sekaligus.Jawaban:
Jika Anda melihat output dari perintah berikut:
atau lebih baik untuk:
Anda dapat melihat bahwa tidak ada fungsi readline untuk semua argumen seperti, misalnya,
yank-last-arg
untuk argumen terakhir - yang dapat menyisipkan argumen terakhir ke perintah sebelumnya (kata terakhir dari entri riwayat sebelumnya). Jadi, jika fungsi seperti itu tidak ada, kemungkinan besar tidak ada jalan pintas untuk mencapai apa yang Anda inginkan.Mari kita coba membuat satu yang mendekati permintaan Anda ...
Pertama, lihat misalnya pada output dari perintah berikut:
Outputnya adalah:
dan dapat diterjemahkan sebagai berikut:
yank-nth-arg
(yang menyisipkan argumen pertama ke perintah sebelumnya - dengan argumen n, masukkan argumen ke-n dari perintah sebelumnya) terikat ke Alt+ Ctrl+ y.Dengan cara yang sama dapat diartikan setiap baris dari output
bind -p
perintah.Sekarang, perhatikan skenario berikut:
Jika Anda mengatur ikatan berikut:
Alt+ Aakan dipetakan ke Alt+ 2Alt+ .yang dipetakan untuk memasukkan argumen kedua dari perintah sebelumnya. Jadi, setelah ketika Anda menekan Alt+ A, argumen kedua dari perintah sebelumnya dimasukkan dalam perintah saat ini.
Jika Anda mengatur:
Setelah ketika Anda menekan Alt+ A, dua argumen pertama dari perintah sebelumnya dimasukkan dalam perintah saat ini. Jika jumlah argumen dari perintah sebelumnya maksimum 2, tentu saja semua perintah sebelumnya dimasukkan dalam perintah saat ini.
Jika Anda mengatur:
Setelah ketika Anda menekan Alt+ A, tiga argumen pertama dari perintah sebelumnya dimasukkan dalam perintah saat ini. Jika jumlah argumen dari perintah sebelumnya maksimum 3 (seperti dalam kasus Anda), tentu saja semua perintah sebelumnya dimasukkan dalam perintah saat ini.
Dan seterusnya.
Untuk 10 argumen pertama, Anda dapat menggunakan:
Dan saya pikir ini cukup lama sejauh saya tidak menggunakan perintah terlalu sering dengan banyak argumen.
Untuk membuatnya gigih, tambahkan baris berikut ke
~/.inputrc
file Anda :Dalam contoh ini saya memilih Alt+ Auntuk menyisipkan semua argumen (jika jumlah argumen tidak lebih dari 10) dari perintah sebelumnya, tetapi Anda dapat memilih kombinasi lain dengan mengganti perintah sebelumnya,
\ea
string.Sumber:
help -m bind
sumber
funmap.c
, fungsiyank-nth-arg
dipetakan ke fungsi Crl_yank_nth_arg
, yang pada gilirannya didefinisikan dalamkill.c
. Secara analog untukyank-last-arg
. Tentu saja mungkin untuk memperluas readline dengan fungsi seperti itu, tetapi saya tidak ingin melakukan itu; Saya lebih suka readline saya dikelolaapt
, dan fitur ini tidak begitu penting;)