bagaimana cara memperluas alias sebaris di bash?

84

Apakah ada cara untuk memperluas alias sebaris di bash?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 
asdfg
sumber

Jawaban:

107

Anda dapat menekan Ctrl- Alt- euntuk melakukan fungsi readline shell-expand-lineyang akan melakukan alias, histori dan perluasan kata. Perhatikan bahwa pada beberapa keyboard Metatidak Alt. Anda mungkin perlu menekan Esclalu Ctrl-e

Fungsi alias-expand-linedan history-and-alias-expand-linetidak terikat secara default, tetapi Anda dapat mengikatnya dengan menambahkan baris yang mirip dengan berikut ke ~/.inputrcfile Anda .

"\e\C-l": alias-expand-line

yang akan membuat Ctrl- Alt- l(huruf kecil "ell") hanya melakukan ekspansi alias.

Dennis Williamson
sumber
Bisakah kita memetakan ekspansi alias ke <tab> tanpa memengaruhi penyelesaian bash lainnya ?.
asdfg
2
@asdfg: Jika Anda melakukannya, itu akan merusak penyelesaian lainnya. Ini mungkin bekerja (belum dicoba) untuk membuat peta seperti yang ditunjukkan di atas dan kemudian menambahkan peta tambahan untuk menggantikan yang sudah ada untuk Tab: "\C-i": "\e\C-l\e\e"yang menciptakan makro yang melakukan baik alias-expand-linedan complete. Itu tergantung pada pengikatan dari jawaban saya di atas dan bahwa pengikatan default untuk Esc-Esc tetap ada. Anda masih dapat melakukan Esc-Esc jika Anda ingin melakukan penyelesaian default.
Dennis Williamson
4
Memang, ESC C-ebekerja untuk Bash, tetapi C-x abekerja untuk Zsh. Juga diuji pada OS X.
Blaz
Jika Anda hanya mencari Ctrl + sesuatu, di mana sesuatu dapat menjadi "x" kunci, Anda dapat melakukannya seperti ini di beberapa sistem: Control-x: history-and-alias-expand-line.
igordcard
1
@ WeijunZhou: Itu tergantung pada manajer jendela Anda dan pengaturan khusus yang Anda miliki. Untuk Gnome, misalnya, layar kunci adalah Super + L.
Dennis Williamson
2

Ini sebenarnya mungkin cara yang jauh lebih sederhana untuk melakukan apa yang Anda coba ( bashversi> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt's manpage: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

starscream_disco_party
sumber
3
Ini salah. Opsi Shell "direxpand" dan "expand_aliases" tidak membantu memperluas alias inline seperti yang ditentukan pertanyaan. Saya tidak tahu dari mana topi "direxpand" diambil ...? Secara default, "expand_aliases" sudah disetel. Jika Anda menghapusnya, hasilnya pada dasarnya untuk menonaktifkan alias dari bekerja (mereka tidak diperluas sebelum interpretasi dari baris perintah). Misalkan diberi alias alias ll='ls -lshell akan menafsirkan 'll' sebagai perintah / fungsi 'll' yang kemungkinan tidak ada.
FooF
0

Ini tidak bekerja. Tapi saya menduga / berharap sesuatu seperti ini dapat dilakukan untuk melakukan apa yang ingin Anda lakukan. Anda harus menggunakan skrip penyelesaian sendiri. Inilah cara Anda membuatnya:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Sekarang sumber file bash_completion lengkap ( http://caliban.org/bash ) dan letakkan skrip yang disebutkan di atas dalam file di dalam direktori bash_completion.d yang skrip yang Anda dapatkan dari referensi url. Beri tahu saya jika itu tidak berhasil.

Terima kasih.

0fnt
sumber
0

Untuk orang-orang yang menginstal zsh mencari solusi sederhana, globalias mungkin menjadi teman Anda

Perluas semua ekspresi glob, sub-perintah, dan alias (termasuk global).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

untuk menginstal cukup tambahkan "globalias" ke daftar plugin .zshrc Anda

plugins=(... globalias)

Kemudian cukup tekan SPACEuntuk memicu perluasan perintah yang telah Anda tulis.

Jika Anda hanya ingin memasukkan spasi tanpa memperluas baris perintah, tekan CTRL+SPACE

Bisa
sumber