Cara memperluas * pada baris perintah Bash

34

Saya mengerti bahwa jika Anda mengetiknya ls *sebenarnya diperluas ke ls a b csaat saat ini secara langsung memiliki file a, bdan c.

Saya bertanya-tanya apakah ada cara untuk memperluas ini sebelum saya menekan enter. Mirip dengan cara kerja Ctrl + X , atau tab complete berfungsi.

Jadi untuk memperjelas diriku

$ ls *
<press magic key>
$ ls a b c

dengan cara yang mirip dengan:

$ ls ~/
<press tab>
$ ls /home/username

Saya pikir saya pernah melihat ini sebelumnya tetapi saya mungkin salah.

bramp
sumber
Yah, saya tahu sedikit tetapi yang terbaik yang saya tahu adalah $ echo * <ENTER> Anda bisa melakukan itu sebelum perintah ls *. Itu tidak cukup memukul tab atau jalan pintas untuk meluaskannya tentu saja.
barlop
Tapi mungkin pengguna linux tidak akan melakukan apa pun seperti ls * banyak karena mungkin tidak diperlukan dengan ls, Tapi juga globbing berperilaku berbeda pada shell yang berbeda sehingga tidak portabel, tetapi ketika nyaman maka baik-baik saja. Tetapi dalam kasus ls, tidak perlu. ls * / daftar direktori tetapi tidak banyak apa ls dirancang untuk dilakukan.
barlop

Jawaban:

19

Anda dapat menggunakan glob-expand-wordfungsi ini, dari man bash:

Kata sebelum titik diperlakukan sebagai pola untuk pathname
ekspansi, dan daftar nama file yang cocok dimasukkan,
mengganti kata. Jika argumen numerik diberikan, sebuah
asterisk ditambahkan sebelum perluasan pathname.

Tambahkan sesuatu seperti ini ke ~/.inputrc:

Control-x: glob-expand-word

Jadi $ ls *diikuti oleh Ctrl-Xakan berkembang menjadi $ ls a b c, dalam contoh Anda.

cYrus
sumber
8
Seharusnya sudah terikat. Dan Ctrl-x sudah terikat sebagai awalan untuk banyak hal. Lakukan bind -p | grep 'C-x'untuk melihat mereka.
Dijeda sampai pemberitahuan lebih lanjut.
Itulah tepatnya yang saya cari! Terima kasih
bramp
@ Dennis, itu belum terikat, tetapi menambahkannya ke .inputrc saya. Saya kira itu standar Debian.
bramp
3
@ Dennis: Ini terikat C-x*pada sistem saya.
cYrus
23

Dalam bash, kemampuan readline dipanggil glob-expand-worddan terikat CtrlX*secara default.

Ignacio Vazquez-Abrams
sumber
11

Saat Anda dalam vimode ( set -o vi), "kunci ajaib" adalah Esc*. Ini bekerja dengan keduanya bashdan ksh.

Jlliagre
sumber
Untuk memperjelas para pemangkas, pertama-tama ketik asterisk sambil mengetikkan baris perintah secara normal, lalu keluar dari mode edit, kursor akan mencari di asterisk jika Anda melarikan diri segera, lalu tekan asterisk dengan kursor yang terletak di asterisk dan glob akan perluas dan jatuhkan Anda dalam mode edit lagi.
NeilG
4
$ bind -q glob-expand-word
glob-expand-word dapat dipanggil melalui "\ Cx *".

$ bind -q insert-completions
masukkan-penyelesaian dapat dipanggil melalui "\ e *".

Jadi untuk menggunakan ini bisa kita lakukan

ls * Ctrl+x *

atau

ls * Esc *

Perluas garis rumit sebelum menekan masuk

Steven Penny
sumber
Ini adalah jawaban terbaik karena mencari pengikat kunci yang tepat, yang bisa berbeda di lingkungan yang berbeda.
wisbucky
0

Alternatif untuk glob-expand-word (\ Cx *) adalah penyisipan-selesai (\ e *). Ini berfungsi tanpa tanda bintang di bagian akhir, tetapi juga termasuk pelengkapan lain seperti file tersembunyi. Saya telah memantulkan kembali keduanya di ~ / .putput:

# insert glob results (\C-x* by default)
"\C-g": glob-expand-word

# insert completion list (\e* by default)
"\ei": insert-completions

glob-complete-word (\ eg) dapat digunakan untuk mengkonversi misalnya /System/Library/Launch*/*Findermenjadi /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
sumber