Comment développer * sur la ligne de commande Bash

34

Je comprends que si vous tapez, ls *il est réellement étendu au ls a b cmoment où le courant a directement des fichiers a, bet c.

Je me demandais s'il y avait un moyen de développer cela avant d'appuyer sur Entrée. Similaire à la façon dont Ctrl + X fonctionne, ou la tabulation complète fonctionne.

Donc, pour être clair

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

d'une manière similaire à:

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

Je pensais avoir déjà vu ça mais je me suis peut-être trompé.

bramp
la source
Eh bien, je sais très peu mais le mieux que je sache est $ echo * <ENTER> Vous pouvez le faire avant la commande ls *. Ce n'est pas tout à fait un onglet ou un raccourci pour l'étendre bien sûr.
barlop
Mais peut-être que les utilisateurs de linux ne feraient rien de tel que ls * much 'car cela n'est probablement pas nécessaire avec ls, mais aussi le globbing se comporte différemment sur différents shells, donc ce n'est pas si portable, mais quand c'est pratique alors très bien. Mais dans le cas de ls, pas nécessaire. ls * / répertorie les répertoires mais pas tellement ce que ls est conçu pour faire.
barlop

Réponses:

19

Vous pouvez utiliser la glob-expand-wordfonction, de l'homme bash:

Le mot avant le point est traité comme un modèle pour le chemin
expansion, et la liste des noms de fichiers correspondants est insérée,
remplacer le mot. Si un argument numérique est fourni, un
un astérisque est ajouté avant l'extension du nom de chemin.

Ajoutez quelque chose comme ça à votre ~/.inputrc:

Control-x: glob-expand-word

Donc $ ls *suivi de Ctrl-Xse développera $ ls a b c, dans votre exemple.

cYrus
la source
8
Il devrait déjà être lié. Et Ctrl-x est déjà lié en tant que préfixe à un tas de choses. Faites bind -p | grep 'C-x'pour les voir.
pause jusqu'à nouvel ordre.
C'est exactement ce que je cherchais! Merci
bramp
@Dennis, il n'était pas déjà lié, mais l'ajouter à mon .inputrc l'a. Je suppose que c'est le défaut de Debian.
bramp
3
@ Dennis: C'est lié à C-x*sur mon système.
cYrus
23

En bash, la capacité readline est appelée glob-expand-wordet est liée CtrlX*par défaut.

Ignacio Vazquez-Abrams
la source
11

Lorsque vous êtes en vimode ( set -o vi), la "clé magique" est Esc*. Cela fonctionne avec les deux bashet ksh.

jlliagre
la source
Juste pour être clair pour les vimmers, tapez d'abord l'astérisque tout en tapant la ligne de commande normalement, puis sortez du mode d'édition, le curseur se localisera sur l'astérisque si vous vous échappez immédiatement, puis appuyez sur l'astérisque avec le curseur situé sur l'astérisque et le glob sera développez et déposez-vous à nouveau en mode édition.
NeilG
4
$ bind -q glob-expand-word
glob-expand-word peut être invoqué via "\ Cx *".

$ bind -q insert-complétions
insert-complétions peut être invoqué via "\ e *".

Donc, pour les utiliser, nous pouvons faire

ls * Ctrl+x *

ou

ls * Esc *

Développez les lignes compliquées avant d'appuyer sur Entrée

Steven Penny
la source
Il s'agit de la meilleure réponse car elle recherche la liaison de touches exacte, qui peut être différente dans différents environnements.
wisbucky
0

Une alternative à glob-expand-word (\ Cx *) est l'insertion-complétions (\ e *). Cela fonctionne sans astérisque à la fin, mais il inclut également d'autres compléments comme des fichiers cachés. J'ai rebondi à la fois dans ~ / .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) peut être utilisé pour convertir par exemple /System/Library/Launch*/*Finderen /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
la source