Como expandir * na linha de comando do Bash

34

Eu entendo que se você digitar ls *na verdade é expandido para ls a b cquando a corrente tem diretamente os arquivos a, be c.

Fiquei me perguntando se existe uma maneira de expandir isso antes de pressionar enter. Semelhante à maneira como Ctrl + X funciona, ou a conclusão completa da tabulação .

Então, para me deixar claro

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

de maneira semelhante a:

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

Eu pensei que já tinha visto isso antes, mas eu poderia estar enganado.

borda
fonte
Bem, eu sei muito pouco, mas o melhor que conheço é $ echo * <ENTER> Você poderia fazer isso antes do comando ls *. Isso não é o suficiente para pressionar a guia ou um atalho para expandi-lo, é claro.
barlop
Mas talvez os usuários do linux não façam algo como ls * much ', porque provavelmente não é necessário com ls, mas também o globbing se comporta de maneira diferente em diferentes shells, portanto não é tão portátil, mas quando conveniente, tudo bem. Mas no caso de ls, não é necessário. ls * / lista os diretórios, mas não o que o ls foi projetado para fazer.
barlop

Respostas:

19

Você pode usar a glob-expand-wordfunção, do man bash:

A palavra antes do ponto é tratada como um padrão para o nome do caminho
expansão e a lista de nomes de arquivos correspondentes é inserida,
substituindo a palavra. Se um argumento numérico for fornecido, um
o asterisco é anexado antes da expansão do nome do caminho.

Adicione algo assim ao seu ~/.inputrc:

Control-x: glob-expand-word

Então, $ ls *seguido por Ctrl-Xirá expandir para $ ls a b c, no seu exemplo.

cYrus
fonte
8
Já deve estar vinculado. E Ctrl-x já está vinculado como um prefixo para várias coisas. Faça bind -p | grep 'C-x'para vê-los.
Pausado até novo aviso.
Era exatamente o que eu estava procurando! Graças
bramp
@ Dennis, ainda não estava vinculado, mas adicioná-lo ao meu .inputrc. Eu acho que esse é o padrão do Debian.
Br28 /
3
@ Dennis: está vinculado ao C-x*meu sistema.
CYrus
23

No bash, o recurso de linha de leitura é chamado glob-expand-worde vinculado CtrlX*por padrão.

Ignacio Vazquez-Abrams
fonte
11

Quando você está no vimodo ( set -o vi), a "chave mágica" é Esc*. Isso funciona com ambos bashe ksh.

jlliagre
fonte
Para ficar claro para os vimmers, primeiro digite o asterisco enquanto digita a linha de comando normalmente e, em seguida, saia do modo de edição, o cursor se localizará no asterisco se você escapar imediatamente, depois pressione asterisco com o cursor localizado no asterisco e a glob expanda e solte você no modo de edição novamente.
NeilG
4
$ bind -q glob-expand-word
glob-expand-word pode ser chamado via "\ Cx *".

$ bind -q inserção-conclusões
as conclusões de inserção podem ser chamadas via "\ e *".

Então, para usá-los, podemos fazer

ls * Ctrl+x *

ou

ls * Esc *

Expanda linhas complicadas antes de pressionar Enter

Steven Penny
fonte
Essa é a melhor resposta, pois procura a combinação exata de teclas, que pode ser diferente em diferentes ambientes.
wisbucky
0

Uma alternativa para glob-expand-word (\ Cx *) é inserção-conclusão (\ e *). Ele funciona sem um asterisco no final, mas também inclui outras conclusões, como arquivos ocultos. Eu recuperei ambos em ~ / .inputrc:

# 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) pode ser usado para converter, por exemplo, /System/Library/Launch*/*Finderpara /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
fonte