Jak rozwinąć * w linii poleceń Bash

34

Rozumiem, że jeśli wpiszesz ls *, to faktycznie zostanie rozwinięte, ls a b cgdy bieżący bezpośrednio ma pliki a, bi c.

Zastanawiałem się, czy istnieje sposób, aby to rozwinąć, zanim wejdę. Podobne do działania klawiszy Ctrl + X lub tabulacji .

Żeby się wyrazić

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

w podobny sposób jak:

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

Myślałem, że już to widziałem, ale mogłem się mylić.

bramp
źródło
Cóż, wiem bardzo niewiele, ale najlepsze, co wiem, to $ echo * <ENTER> Możesz to zrobić przed poleceniem ls *. Oczywiście nie jest to uderzenie w kartę ani skrót, aby ją rozwinąć.
barlop
Ale być może użytkownicy Linuksa nie zrobiliby czegoś takiego jak ls *, ponieważ prawdopodobnie nie jest to konieczne w przypadku ls, ale także globowanie zachowuje się inaczej w różnych powłokach, więc nie jest tak przenośne, ale gdy jest to wygodne, w porządku. Ale w przypadku ls nie jest to konieczne. ls * / wyświetla katalogi, ale nie tyle, do czego służy ls.
barlop

Odpowiedzi:

19

Możesz użyć glob-expand-word funkcji z man bash:

Słowo przed punktem jest traktowane jako wzorzec nazwy ścieżki
rozszerzenie i wstawiana jest lista pasujących nazw plików,
zastępując słowo. Jeśli podano argument numeryczny, an
gwiazdka jest dodawana przed rozwinięciem nazwy ścieżki.

Dodaj coś takiego do swojego ~/.inputrc:

Control-x: glob-expand-word

Tak więc $ ls *następuje Ctrl-Xrozwinięcie do $ ls a b c, w twoim przykładzie.

Cyrus
źródło
8
Powinien już być związany. Ctrl-x jest już związany jako przedrostek wielu rzeczy. Zrób bind -p | grep 'C-x'je zobaczyć.
Wstrzymano do odwołania.
Właśnie tego szukałem! Dzięki
bramp
@Dennis, nie był jeszcze związany, ale dodanie go do mojego .inputrc ma. Myślę, że to domyślne ustawienie Debiana.
ziomek
3
@Dennis: Jest to związane z C-x*moim systemem.
Cyrus
23

W bashie wywoływana jest funkcja readline glob-expand-word i jest CtrlX*domyślnie związana .

Ignacio Vazquez-Abrams
źródło
11

W vitrybie ( set -o vi) „magicznym kluczem” jest Esc*. Działa to zarówno z, jak bashi ksh.

jlliagre
źródło
Dla jasności dla vimerów, najpierw wpisz gwiazdkę podczas normalnego pisania wiersza poleceń, a następnie wyjdź z trybu edycji, kursor znajdzie się na gwiazdce, jeśli natychmiast uciekniesz, a następnie naciśnij gwiazdkę kursorem umieszczonym na gwiazdce, a glob będzie rozwinąć i upuścić cię ponownie w trybie edycji.
NeilG
4
$ bind -q glob-expand-word
glob-expand-word można wywołać za pomocą „\ Cx *”.

$ bind -q wstawianie uzupełnień
uzupełnienia wstawiania można wywoływać za pomocą „\ e *”.

Aby z nich skorzystać, możemy to zrobić

ls * Ctrl+x *

lub

ls * Esc *

Rozwiń skomplikowane linie przed wciśnięciem Enter

Steven Penny
źródło
To najlepsza odpowiedź, ponieważ wyszukuje dokładne przypisanie klawiszy, które mogą być różne w różnych środowiskach.
wisbucky
0

Alternatywą dla glob-expand-word (\ Cx *) jest wstawianie uzupełnień (\ e *). Działa bez gwiazdki na końcu, ale zawiera również inne uzupełnienia, takie jak ukryte pliki. Mam odbicie zarówno w ~ / .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) może być użyty do konwersji np . /System/Library/Launch*/*Finderna /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
źródło